如何在GROUP BY的结果中添加与条件匹配的额外列?

时间:2019-05-29 13:06:16

标签: mysql sql group-by

我正在尝试使用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

我尝试了此查询,但是选择的文件名是MINIMUM,而不是与style = 2匹配的文件名。

SELECT category, SUM(value) AS total_value, MIN(filename) AS filename FROM data GROUP BY category;

2 个答案:

答案 0 :(得分:2)

如果我正确理解,则需要此:

SELECT category, SUM(value) AS total_value, 
MIN(case when style = 2 then filename end) AS filename 
FROM data GROUP BY category;

答案 1 :(得分:-1)

尽管我更喜欢@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

编辑:

我使用的网站似乎没有严格的限制,因为在使用colum时,蜂鸣器不在组中列出或在汇总函数中使用。

所以这里是更新版本,使用filname上的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;