Заявка, която връща необходимия резултат от таблица с дублирани стойности

Имаме 2 маси:

Клиенти:

select name, i_customer from Customers limit 5;

| Western Refinishers (Pty) Ltd             |       2265 |
| Westonaria Motor Investments (Pty) Ltd    |       1949 |
| Wild Break 1479 cc                        |       1225 |
| Workshop On Wheels (Pty) Ltd              |       2582 |
| Wynberg Panelbeaters And Spray Painters   |       2471 |

Custom_Field_Values:

select i_customer, i_custom_field, value
from Custom_Field_Values
where i_custom_field in (14,15,16,17,18) limit 5;

+------------+----------------+-------+
| i_customer | i_custom_field | value |
+------------+----------------+-------+
|         64 |             14 | 101   |
|        321 |             14 | 101   |
|        321 |             16 | 2233  |
|       1519 |             14 | 102   |
|       1529 |             14 | 102   |
+------------+----------------+-------+

Един и същи клиент може да има множество записи в таблицата Custom_Field_Values. Например с i_custom_field 14 и 16.

Трябва да извлека отчет, който връща всички уникални имена на клиенти и Custom_Field_Values.values ​​само за записи с i_custom_field с номера 16,17,18.

Ако клиентът няма запис с i_custom_field в (16,17,18), просто заменете стойността му с празен низ.


person sliddy    schedule 10.03.2016    source източник
comment
Какво ще кажете да използвате LEFT JOIN за всяко от желаните персонализирани полета?   -  person Roman Hocke    schedule 10.03.2016
comment
какво ще кажете, ако клиент има няколко реда в Custom_Field_Values ​​с i_custom_field в (16,17,18)?   -  person Dylan Su    schedule 10.03.2016
comment
Какво ще кажете за другото съвпадение?? Трябва ли да има загуба на други данни?   -  person Murad Hasan    schedule 10.03.2016


Отговори (2)


Можете да опитате LEFT JOIN по следния начин:

SELECT c.name, cfv.value 
FROM customer c 
LEFT JOIN Customer_Field_Values cfv
ON c.i_customer = cfv.i_customer
AND cfv.i_custom_field > 15
AND cfv.i_custom_field < 19;
person Dennis van Opstal    schedule 10.03.2016

Ако за един и същи клиент се намерят няколко реда с i_custom_field в (16,17,18), стойността се сумира като изходна стойност.

Ето го решението.

SELECT 
    c.name, COALESCE( SUM(v.value), '') value
FROM 
    Customers c LEFT JOIN Custom_Field_Values v USING(i_customer)
WHERE 
    v.i_custom_field IN (16, 17, 18)
GROUP BY 
    c.name
person Dylan Su    schedule 10.03.2016