Группирование результатов нескольких GROUP_CONCAT () только с разными значениями - PullRequest
0 голосов
/ 19 июня 2020

вторая попытка ответить на этот вопрос более подробно. Я пытаюсь сгруппировать различные значения нескольких столбцов для объектов с одинаковым именем. Я могу использовать GROUP_CONCAT для каждого столбца «Тип», но не могу объединить их вместе, чтобы получить отдельный набор значений для каждого имени

Вот образец моих данных:

+----------+-------+-------+-------+
| Company  | Type1 | Type2 | Type3 |
+----------+-------+-------+-------+
| Generic  | 1     | NULL  | 3     |
+----------+-------+-------+-------+
| Generic  | NULL  | 2     | 2     |
+----------+-------+-------+-------+
| Generic  | 3     | 2     | NULL  |
+----------+-------+-------+-------+
| Generic2 | 1     | NULL  | NULL  |
+----------+-------+-------+-------+
| Generic2 | NULL  | 2     | 2     |
+----------+-------+-------+-------+
| Generic2 | 1     | 2     | NULL  |
+----------+-------+-------+-------+

И вот основной запрос c, который я должен придумать, НЕ работает должным образом:

SELECT s.company, CONCAT(GROUP_CONCAT(DISTINCT s.type1),',',GROUP_CONCAT(DISTINCT s.type2),',',GROUP_CONCAT(DISTINCT s.type3)) AS GROUPED
FROM sample s
GROUP BY s.company

Приведенный выше запрос возвращает:

+----------+-----------+
| Company  | GROUPED   |
+----------+-----------+
| Generic  | 1,3,2,3,2 |
+----------+-----------+
| Generic2 | 1,2,2     |
+----------+-----------+

What Мне нужно, чтобы он возвращал группировку групп только с разными значениями:

+----------+---------+
| Company  | GROUPED |
+----------+---------+
| Generic  | 1,2,3   |
+----------+---------+
| Generic2 | 1,2     |
+----------+---------+

Возможно ли это?

1 Ответ

2 голосов
/ 19 июня 2020

Один из вариантов - преобразовать столбцы в строки перед группировкой. В MySQL вы можете сделать это с помощью union all:

select company, group_concat(distinct typex order by typex) res
from (
    select company, type1 typex from mytable
    union all select company, type2 from mytable
    union all select company, type3 from mytable
) t
group by company

Демо на DB Fiddle :

company  | res  
:------- | :----
Generic  | 1,2,3
Generic2 | 1,2  
...