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

MySQL查询:按日期分组统计指定名称的记录计数

解决按Date分组统计目标子串出现记录数的问题

你遇到的核心问题是之前的查询按原始name字段值分组,导致把aaa|bbb这类组合值当成了独立分组,而我们需要的是按每个目标名称(aaa/bbb/ccc),统计每个date下包含该名称的记录数量。这里提供两种简洁的解决方案:

方案1:使用UNION ALL拆分统计

这种方法直观易懂,分别统计每个目标名称的记录数后合并结果:

SELECT 
    date,
    'aaa' AS name,
    COUNT(*) AS count
FROM mytable
WHERE name LIKE '%aaa%'
GROUP BY date
UNION ALL
SELECT 
    date,
    'bbb' AS name,
    COUNT(*) AS count
FROM mytable
WHERE name LIKE '%bbb%'
GROUP BY date
UNION ALL
SELECT 
    date,
    'ccc' AS name,
    COUNT(*) AS count
FROM mytable
WHERE name LIKE '%ccc%'
GROUP BY date
ORDER BY date, name;

原理说明:

  • 每个SELECT块单独统计一个目标名称在各date下的记录数(只要name字段包含该子串就算一条)
  • UNION ALL将三个统计结果合并成一个格式统一的结果集
  • 最后按date和name排序,完全匹配你期望的输出格式

方案2:使用CTE生成目标名称列表(更灵活)

如果后续需要统计更多目标名称,这种方法只需修改CTE中的名称列表即可,无需重复编写多个SELECT语句:

WITH names_to_count AS (
    SELECT 'aaa' AS target_name UNION ALL
    SELECT 'bbb' UNION ALL
    SELECT 'ccc'
)
SELECT 
    m.date,
    n.target_name AS name,
    COUNT(*) AS count
FROM mytable m
JOIN names_to_count n 
  ON m.name LIKE CONCAT('%', n.target_name, '%')
GROUP BY m.date, n.target_name
ORDER BY m.date, n.target_name;

原理说明:

  • names_to_count CTE先定义好我们要统计的所有目标名称
  • 通过JOIN关联原表,筛选出name包含对应目标子串的记录
  • 最后按date和目标名称分组统计,得到最终结果

结果验证

针对你提供的原始数据,这两个方案都会得到如下结果(注:修正了date=11时bbb的计数,因为原始数据中date=11有2条记录包含bbb,符合逻辑):

date | name | count
11   | aaa  | 3
11   | bbb  | 2
11   | ccc  | 2
12   | aaa  | 3
12   | bbb  | 2
12   | ccc  | 2

内容的提问来源于stack exchange,提问作者Subhajit

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 04:24:33