按月份统计符合条件行数:SQL查询结果不符合预期求助
解决按月份统计特定条件行数的问题
嘿,我来帮你搞定这个统计问题~你的SQL语句之所以只返回全表总数,核心问题是子查询没有和外层的月份做关联,每个子查询都在计算全表符合条件的行数,而非对应月份的数据。咱们换用CASE表达式配合聚合函数的方式,就能精准实现按月份统计每个字段的符合条件行数啦。
正确的SQL语句
SELECT MONTHNAME(tanggal) as bulan, COUNT(CASE WHEN iad != '-' THEN 1 END) as iadp, COUNT(CASE WHEN isk != '-' THEN 1 END) as isk, COUNT(CASE WHEN vap != '-' THEN 1 END) as vap, COUNT(CASE WHEN hap != '-' THEN 1 END) as hap, COUNT(CASE WHEN plebitis != 'tidak' THEN 1 END) as plebitis FROM triwulan GROUP BY bulan, MONTH(tanggal) -- 避免不同年份的同月份被合并统计 ORDER BY MONTH(tanggal);
写法说明
CASE WHEN 条件 THEN 1 END:当字段满足条件时返回1,否则返回NULL。而COUNT()函数会自动忽略NULL值,最终统计的就是当月符合该条件的行数。- 把
MONTH(tanggal)加入GROUP BY是为了严谨性——如果你的数据跨年份,这样能避免2023年1月和2024年1月被合并成同一行;如果数据仅单一年份,这部分可以省略。 ORDER BY MONTH(tanggal)能让结果按月份顺序排列,看起来更直观。
另外,你也可以用SUM()代替COUNT(),写法逻辑一致,效果相同:
SELECT MONTHNAME(tanggal) as bulan, SUM(CASE WHEN iad != '-' THEN 1 ELSE 0 END) as iadp, SUM(CASE WHEN isk != '-' THEN 1 ELSE 0 END) as isk, SUM(CASE WHEN vap != '-' THEN 1 ELSE 0 END) as vap, SUM(CASE WHEN hap != '-' THEN 1 ELSE 0 END) as hap, SUM(CASE WHEN plebitis != 'tidak' THEN 1 ELSE 0 END) as plebitis FROM triwulan GROUP BY bulan, MONTH(tanggal) ORDER BY MONTH(tanggal);
选你觉得顺手的写法就好~
内容的提问来源于stack exchange,提问作者Henry Wilson
相关产品推荐
相关产品推荐

