You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

按日期部分分组统计记录值总数,按月统计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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.19 09:09:13