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

如何在单SELECT语句中按多条件分组并横向展示统计结果

解决方案

要实现横向展示各时间区间的统计结果,你可以用条件聚合(在聚合函数中嵌套CASE语句)来完成行转列,不需要用UNION。修改后的查询语句如下:

SELECT 
  p.category,
  COUNT(CASE WHEN TIMESTAMPDIFF(YEAR, p.dt, CURDATE()) BETWEEN 1 AND 5 THEN 1 END) AS `1-5`,
  COUNT(CASE WHEN TIMESTAMPDIFF(YEAR, p.dt, CURDATE()) BETWEEN 6 AND 9 THEN 1 END) AS `6-9`,
  COUNT(CASE WHEN TIMESTAMPDIFF(YEAR, p.dt, CURDATE()) BETWEEN 10 AND 15 THEN 1 END) AS `10-15`,
  COUNT(CASE WHEN TIMESTAMPDIFF(YEAR, p.dt, CURDATE()) >=16 THEN 1 END) AS `16-20`
FROM product p  
GROUP BY p.category;

说明:

  • 每个COUNT(CASE ...)会单独统计对应时间区间的产品数量:当满足区间条件时返回1,否则返回NULL,COUNT会忽略NULL值,得到该区间的有效计数。
  • GROUP BY只保留p.category,这样每个分类会生成一行数据,各区间的统计结果作为列横向展示。
  • 区间列名用反引号`包裹,避免因为包含特殊字符(比如减号)导致语法错误。

如果需要处理区间内无数据的情况(显示0而非NULL),可以用IFNULL包裹COUNT:

SELECT 
  p.category,
  IFNULL(COUNT(CASE WHEN TIMESTAMPDIFF(YEAR, p.dt, CURDATE()) BETWEEN 1 AND 5 THEN 1 END), 0) AS `1-5`,
  IFNULL(COUNT(CASE WHEN TIMESTAMPDIFF(YEAR, p.dt, CURDATE()) BETWEEN 6 AND 9 THEN 1 END), 0) AS `6-9`,
  IFNULL(COUNT(CASE WHEN TIMESTAMPDIFF(YEAR, p.dt, CURDATE()) BETWEEN 10 AND 15 THEN 1 END), 0) AS `10-15`,
  IFNULL(COUNT(CASE WHEN TIMESTAMPDIFF(YEAR, p.dt, CURDATE()) >=16 THEN 1 END), 0) AS `16-20`
FROM product p  
GROUP BY p.category;

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.19 17:17:14