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

Вы можете использовать подзапрос и 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