MySQL GROUP BY分组统计:按字段分组,统计不同stock值的Total1与Total2
解决MySQL按分组统计不同stock值对应总量的方案
没问题,这个需求用条件聚合就能完美实现,核心就是在聚合函数里结合条件判断,分别统计stock=0和stock=1的对应总量。下面给你两种常见场景的SQL写法:
场景1:统计符合条件的记录条数
如果Total1和Total2是要统计对应stock值的记录数量,用COUNT结合CASE WHEN:
SELECT ID, Libelle, -- 统计stock=0的记录数 COUNT(CASE WHEN stock = 0 THEN 1 END) AS Total1, -- 统计stock=1的记录数 COUNT(CASE WHEN stock = 1 THEN 1 END) AS Total2 FROM your_table -- 替换成你的实际表名 GROUP BY ID, Libelle;
这里CASE WHEN在满足条件时返回1,不满足时默认返回NULL,而COUNT会自动忽略NULL值,刚好实现分组统计对应stock的记录数。
场景2:统计某个数值字段的总和
如果Total1和Total2是要统计对应stock值下某个数值字段(比如amount、quantity)的总和,用SUM结合CASE WHEN:
SELECT ID, Libelle, -- 统计stock=0时的数值总和 SUM(CASE WHEN stock = 0 THEN your_numeric_field ELSE 0 END) AS Total1, -- 统计stock=1时的数值总和 SUM(CASE WHEN stock = 1 THEN your_numeric_field ELSE 0 END) AS Total2 FROM your_table -- 替换成你的实际表名 GROUP BY ID, Libelle;
这里不满足条件时返回0,保证SUM计算时不会遗漏分组(如果某个分组没有对应stock值,会返回0而不是NULL)。
简化写法(可选)
如果你的MySQL版本支持,也可以用IF函数替代CASE WHEN,代码更简洁:
-- 统计记录数的简化版 SELECT ID, Libelle, COUNT(IF(stock = 0, 1, NULL)) AS Total1, COUNT(IF(stock = 1, 1, NULL)) AS Total2 FROM your_table GROUP BY ID, Libelle;
不过CASE WHEN是SQL标准语法,兼容性更好,如果你需要跨数据库迁移,推荐用第一种写法。
内容的提问来源于stack exchange,提问作者Anerty
相关产品推荐
相关产品推荐

