按日期部分分组统计记录值总数,按月统计score和valid总数技术求助
按月统计Score与Valid总数的解决方案
嗨,我来帮你搞定这个按月统计的需求!先假设咱们的表结构是常规的业务表(如果和你的实际表有出入,你可以调整字段名就行):
- 表名:
records - 核心字段:
record_date:记录的日期/时间字段(DATE或DATETIME类型)score:评分值(可以是整数比如1-5,也可以是枚举字符串比如'A/B/C')valid:有效性标记(布尔型true/false,或者整数1/0)
下面分两种最常用的场景给你对应的SQL写法,你可以根据自己的需求选:
场景1:每个月一行,展示所有Score值的计数 + Valid各状态总数
这种适合你想把每个score的数量都作为单独列展示,一眼看清当月各评分的分布,同时看有效/无效的总数量。
MySQL版本示例
SELECT DATE_FORMAT(record_date, '%Y-%m') AS month, -- 按你的score实际取值,逐个写CASE统计 SUM(CASE WHEN score = 1 THEN 1 ELSE 0 END) AS score_1_count, SUM(CASE WHEN score = 2 THEN 1 ELSE 0 END) AS score_2_count, SUM(CASE WHEN score = 3 THEN 1 ELSE 0 END) AS score_3_count, -- 如果score是字符串类型,就改成引号包裹的取值,比如: -- SUM(CASE WHEN score = 'A' THEN 1 ELSE 0 END) AS score_A_count, -- 统计valid的两种状态总数 SUM(CASE WHEN valid = TRUE THEN 1 ELSE 0 END) AS valid_true_total, SUM(CASE WHEN valid = FALSE THEN 1 ELSE 0 END) AS valid_false_total FROM records GROUP BY DATE_FORMAT(record_date, '%Y-%m') ORDER BY month;
其他数据库的月份适配
如果用PostgreSQL,把DATE_FORMAT(record_date, '%Y-%m')换成TO_CHAR(record_date, 'YYYY-MM');如果是SQL Server,换成FORMAT(record_date, 'yyyy-MM')就行。
场景2:每个月+每个Score值一行,展示该分组下的计数与Valid状态
这种更灵活,不管你的score有多少种取值,都能自动遍历展示,不用手动写每个score的CASE,适合score取值不确定或较多的情况。
MySQL版本示例
SELECT DATE_FORMAT(record_date, '%Y-%m') AS month, score, COUNT(*) AS score_group_count, -- 统计当前月份+score分组下的valid各状态数量 SUM(CASE WHEN valid = TRUE THEN 1 ELSE 0 END) AS valid_true_in_group, SUM(CASE WHEN valid = FALSE THEN 1 ELSE 0 END) AS valid_false_in_group FROM records GROUP BY DATE_FORMAT(record_date, '%Y-%m'), score ORDER BY month, score;
这个写法会把每个月份的每个score值单独成一行,同时显示该分组内有效和无效的记录数,排序后也很容易查看趋势。
如果你还需要额外统计整个月份的valid总数量(不按score拆分),可以把场景1的valid统计部分单独做一个子查询,再和场景2的结果关联起来就行。
内容的提问来源于stack exchange,提问作者Yener
相关产品推荐
相关产品推荐

