编写SQL查询:按ID、Case分组统计数量并展示Time=1对应日期
SQL分组统计与指定字段提取解决方案
没问题,我来帮你搞定这个SQL查询需求。先把相关信息整理清楚:
原始数据集
| ID | case | date | time |
|---|---|---|---|
| 101 | A | 2001 | 1 |
| 101 | A | 2002 | 2 |
| 102 | A | 2001 | 1 |
| 103 | B | 2001 | 1 |
| 101 | B | 2003 | 1 |
| 101 | A | 2004 | 3 |
| 102 | C | 2006 | 1 |
| 101 | B | 2007 | 2 |
| 103 | C | 2007 | 1 |
需求概述
我们需要实现:
- 按
ID和case分组,统计每组的总记录数(命名为qty) - 每个分组仅展示该组内
time=1对应的date值(比如ID=101的A组取2001,B组取2003)
预期输出示例
| ID | case | date | qty |
|---|---|---|---|
| 101 | A | 2001 | 3 |
| 101 | B | 2003 | 2 |
对应的SQL查询方案
SELECT ID, `case`, MAX(CASE WHEN time = 1 THEN date END) AS date, COUNT(*) AS qty FROM your_table_name -- 替换成你的实际表名 GROUP BY ID, `case` ORDER BY ID, `case`;
代码细节解释
- 分组逻辑:
GROUP BY ID, \case``确保我们按ID和case的唯一组合来聚合数据,这是统计分组数量的基础。 - 提取目标日期:
MAX(CASE WHEN time = 1 THEN date END)是核心逻辑——它会在每个分组里筛选出time=1的记录,并提取对应的date值。因为每个分组里time=1的记录只会有一条(从你的数据来看),用MAX或者MIN都能得到正确结果;如果你的场景里可能有多条time=1的记录,可以根据需求调整成MIN或者其他聚合逻辑。 - 统计记录数:
COUNT(*)直接统计每个分组下的总记录条数,命名为qty。 - 关键字处理:
case是SQL的保留关键字,所以用反引号()包裹避免语法错误。不同数据库的写法略有差异:SQL Server用[case],Oracle用"case"`,你可以根据自己使用的数据库调整。 - 排序优化:
ORDER BY ID, \case``让结果按ID和case排序,阅读起来更清晰。
内容的提问来源于stack exchange,提问作者Hossein Tasm




