如何利用ROWNUM值将日期填充至不同列?
问题解决:将多行数据按ID转成宽表
原代码问题分析
你写的CASE语句逻辑有误,而且没有按ID分组,导致每条原始记录单独生成一行,所以Col1和Col2只能交替有值,无法合并到同一ID的行里。
正确SQL实现
要实现按ID聚合,把不同ROWNUM的DATE值映射到对应列,需要结合聚合函数+CASE语句+分组,示例代码如下(支持到10列):
SELECT ID, MAX(CASE WHEN ROWNUM = 1 THEN DATE END) AS Col1, MAX(CASE WHEN ROWNUM = 2 THEN DATE END) AS Col2, MAX(CASE WHEN ROWNUM = 3 THEN DATE END) AS Col3, MAX(CASE WHEN ROWNUM = 4 THEN DATE END) AS Col4, MAX(CASE WHEN ROWNUM = 5 THEN DATE END) AS Col5, MAX(CASE WHEN ROWNUM = 6 THEN DATE END) AS Col6, MAX(CASE WHEN ROWNUM = 7 THEN DATE END) AS Col7, MAX(CASE WHEN ROWNUM = 8 THEN DATE END) AS Col8, MAX(CASE WHEN ROWNUM = 9 THEN DATE END) AS Col9, MAX(CASE WHEN ROWNUM = 10 THEN DATE END) AS Col10 FROM your_table_name GROUP BY ID;
逻辑说明
- 用
GROUP BY ID把同一ID的所有记录聚合到一行 - 每个CASE语句只保留对应ROWNUM的DATE值,其余情况返回NULL
- 聚合函数
MAX会自动忽略NULL值,将有效DATE值填充到对应列中(用MIN效果一样,因为每个ID+ROWNUM只有唯一一条记录)
验证结果
用你提供的原始数据执行上述SQL,会得到你期望的结果:
| ID | Col1 | Col2 |
|---|---|---|
| 1 | 1/1/2000 | 1/2/2000 |
| 2 | 12/30/2000 | 12/31/2000 |
内容的提问来源于stack exchange,提问作者jay
相关产品推荐
相关产品推荐

