Я пытаюсь использовать GROUP BY для создания сводной таблицы, но я хочу добавить столбец со значением, которое соответствует условию из исходной таблицы. Условие, которое я хочу проверить, заключается в том, что style = 2, чтобы в результатах отображался новый столбец с именем файла, соответствующим этому стилю.

Вот как выглядит исходная таблица:

category  |  value | style | filename
   A      |   8    |   0   |   AAA    
   B      |   4    |   2   |   BBB    
   B      |   6    |   1   |   CCC    
   A      |   3    |   2   |   DDD    
   A      |   6    |   1   |   EEE    
   C      |   7    |   2   |   FFF   
   B      |   5    |   1   |   GGG    
   A      |   3    |   1   |   HHH    

Это то, что я хочу:

category  |  total_value   | filename
   A      |        20      |   DDD
   B      |        15      |   BBB
   C      |         7      |   FFF

Я пробовал этот запрос, но выбранное имя файла было МИНИМАЛЬНЫМ, а не тем, которое соответствует style = 2:

SELECT category, SUM(value) AS total_value, MIN(filename) AS filename FROM data GROUP BY category;
0
oscarjrs 29 Май 2019 в 16:06

2 ответа

Лучший ответ

Если я правильно понимаю, вам нужно это:

SELECT category, SUM(value) AS total_value, 
MIN(case when style = 2 then filename end) AS filename 
FROM data GROUP BY category;
2
Oto Shavadze 29 Май 2019 в 13:16

Хотя мне больше нравится ответ @Oto Shavadze, я все же хотел бы поделиться решением, о котором подумал:

select data.category, SUM(data.value), hlp.filename
from data 
left join ( 
    select category, filename
    from data 
    where style = 2 
    group by category
    limit 1
) as hlp
on data.category = hlp.category
group by data.category

Это решение использует подзапрос, который выберет соответствующий filename для каждого category.

< Сильный > EDIT :

Похоже, что веб-сайт, который я использовал, не был слишком строгим, поскольку использование colum не занесено в группу и не является агрегатной функцией.

Итак, вот обновленная версия, использующая функцию MIN () для имени файла, как я сказал в комментариях:

select data.category, SUM(data.value), MIN(hlp.filename)
from data 
left join ( 
    select category, MIN(filename) as filename
    from data 
    where style = 2 
    group by category
) as hlp
on data.category = hlp.category
group by data.category;
-1
Tim Schmidt 29 Май 2019 в 13:51