SQL заявка за намиране на дубликат и получаване на други стойности

Ето моя проблем. Бих искал да намеря дублиращи се „кодове ifls“ и да получа различните складове, където получавам този дублиран код

Ето как изглежда таблицата:

| code ifls | warehouse | 
|    4013   |        1  | 
|    4013   |        2  | 
|    4013   |        3  | 
|    4014   |        4  | 
|    4014   |        5  | 
|    4015   |        5  |  

Резултатът трябва да изглежда така:

| code ifls | warehouse | warehouse | warehouse |
|    4013   |     1     |     2     |     3     | 
|    4014   |     4     |     5     |           |

Опитах тази заявка, но без успех...

SELECT code ifls as ifls, (SELECT warehouse FROM catalogue WHERE code ifls= ifls) 
FROM catalogue GROUP BY code ifls HAVING COUNT(code ifls) > 1

Как бихте изразили това в SQL заявка?


person Guibrid    schedule 25.03.2016    source източник
comment
stackoverflow.com/questions/36177816/   -  person Zafar Malik    schedule 25.03.2016
comment
Не можете лесно да имате динамичен брой колони като този. Има ли зададен максимален брой колони, от които се нуждаете, или се опитвате да генерирате колони според изискванията?   -  person Joachim Isaksson    schedule 25.03.2016


Отговори (3)


GROUP_CONCAT() вероятно е най-простият начин да направите това, което се опитвате да направите, без да усложнявате нещата, като използвате динамични колони;

SELECT `code ifls`, GROUP_CONCAT(warehouse) warehouses
FROM myTable
GROUP BY `code ifls`
HAVING COUNT(*) > 1

SQLfiddle за тестване.

По принцип доставя списък със складове, разделен със запетая, за всеки code ilfs, но HAVING го ограничава до редове с повече от един склад.

person Joachim Isaksson    schedule 25.03.2016
comment
Страхотен! Точно това ми трябва! Благодаря Йоахим! - person Guibrid; 25.03.2016

Можете да използвате subselect и group_concat

select `code ifls`, group_concat(warehouse) 
from table  
where `code ifls` in (
    select `code ifls`, count(*)  
    from table 
    group by `code ifls`
    having count(*) > 1
)
group by `code ifls`
person scaisEdge    schedule 25.03.2016

Ето вашия код-

SELECT `code ifls`, 
SUBSTRING_INDEX(GROUP_CONCAT(warehouse),',',1) AS warehouse_1, 
IF((LENGTH(GROUP_CONCAT(warehouse)) - LENGTH(GROUP_CONCAT(warehouse SEPARATOR ''))) < 1,'',SUBSTRING_INDEX(SUBSTRING_INDEX(GROUP_CONCAT(warehouse),',',2),',',-1)) AS warehouse_2, 
IF((LENGTH(GROUP_CONCAT(warehouse)) - LENGTH(GROUP_CONCAT(warehouse SEPARATOR ''))) < 2,'',SUBSTRING_INDEX(GROUP_CONCAT(warehouse),',',-1)) AS warehouse_3 
FROM `catalogue`
GROUP BY `code ifls`;
person Zafar Malik    schedule 25.03.2016