SQL多条件计数转新列 如何将不同flag的统计行合并为单行结果
实现方案
你要的效果是典型的行转列统计,用条件聚合就能实现,不需要按table2.FLAG分组,直接针对三个不同的flag取值分别做计数即可:
SELECT table1.ID, table1.FLAG, COUNT(CASE WHEN table2.FLAG = 'Active' THEN 1 END) AS Active_Count, COUNT(CASE WHEN table2.FLAG = 'Suspend' THEN 1 END) AS Suspend_Count, COUNT(CASE WHEN table2.FLAG = 'Other' THEN 1 END) AS Other_Count FROM table1 INNER JOIN table2 ON table1.ID = table2.ID WHERE table1.ID = 123 GROUP BY table1.ID, table1.FLAG;
说明
- 这里把原来的隐式连接改成了更规范的显式
INNER JOIN,逻辑和你原来的写法完全一致,可读性更强 - 每个
CASE WHEN只会匹配对应table2.FLAG取值的行,不匹配的会返回NULL,而COUNT会忽略NULL值,刚好能得到对应分类的统计数 - 分组字段只需要保留
table1.ID和table1.FLAG,最终只会返回1行符合条件的结果
如果你的数据库支持IF函数(比如MySQL),还可以写成更简化的版本:
SELECT table1.ID, table1.FLAG, SUM(IF(table2.FLAG = 'Active', 1, 0)) AS Active_Count, SUM(IF(table2.FLAG = 'Suspend', 1, 0)) AS Suspend_Count, SUM(IF(table2.FLAG = 'Other', 1, 0)) AS Other_Count FROM table1 INNER JOIN table2 ON table1.ID = table2.ID WHERE table1.ID = 123 GROUP BY table1.ID, table1.FLAG;
内容的提问来源于stack exchange,提问作者Robotoflex
相关产品推荐
相关产品推荐

