Group By子句返回过多行:如何按CaseID聚合各Stage最新EventDate
问题分析与解决
你的SQL语句问题出在GROUP BY的分组字段:你同时按CaseID和Stage分组,这会让数据库把每个CaseID下的不同Stage当成独立分组,所以每个CaseID会生成对应A/B/C的三行结果,自然出现大量NULL值。
要实现每个CaseID一行、各Stage列显示最新日期的需求,需要调整两个关键点:
- 把
MAX()函数包裹在CASE表达式外面,确保先筛选对应Stage的日期,再取最大值 - GROUP BY只保留
CaseID,让数据按CaseID聚合为单行
修正后的SQL语句
SELECT CaseID, MAX(CASE WHEN Stage = 'A' THEN EventDate END) AS A, MAX(CASE WHEN Stage = 'B' THEN EventDate END) AS B, MAX(CASE WHEN Stage = 'C' THEN EventDate END) AS C FROM StageTable GROUP BY CaseID
执行结果
| CaseID | A | B | C |
|---|---|---|---|
| 1 | 01/01/10 | 01/04/10 | 01/05/10 |
| 2 | 02/01/10 | 02/02/10 | 02/05/10 |
逻辑说明
MAX(CASE WHEN Stage = 'A' THEN EventDate END):先筛选当前CaseID下所有Stage为A的EventDate,再取其中的最大值;如果某个CaseID没有对应Stage,会返回NULL,但MAX会自动忽略不匹配的NULL值,不影响有效数据的展示- GROUP BY仅按CaseID分组,确保每个CaseID只生成一行结果,所有Stage的最新日期都会聚合到这一行中
内容的提问来源于stack exchange,提问作者sqlnoob
相关产品推荐
相关产品推荐

