如何在Oracle SQL中转置表格?附原表与目标表示例
Oracle SQL 实现表格行转列(转置)
针对你需要将多行日期转换为多列的需求,以下是两种可行的Oracle SQL解决方案:
方法一:使用PIVOT函数(Oracle 11g及以上版本)
PIVOT是Oracle专门用于行转列的函数,配合窗口函数为每个用户的日期生成序号后,即可快速完成转置:
WITH numbered_dates AS ( SELECT firstname, lastname, "Date", ROW_NUMBER() OVER (PARTITION BY firstname, lastname ORDER BY "Date") AS date_seq FROM your_table_name ) SELECT firstname, lastname, "1" AS Date1, "2" AS Date2, "3" AS Date3 FROM numbered_dates PIVOT ( MAX("Date") FOR date_seq IN (1, 2, 3) ) ORDER BY firstname, lastname;
说明:
numbered_dates子查询:通过ROW_NUMBER()按用户分组,对每个用户的日期按顺序生成1、2、3的序号PIVOT子句:将序号为1、2、3的日期分别聚合为Date1、Date2、Date3列,用MAX()是因为每个序号对应唯一日期,聚合函数不影响结果
方法二:使用条件聚合(兼容所有Oracle版本)
如果你的Oracle版本低于11g,可使用条件聚合的方式实现,逻辑更通用:
SELECT firstname, lastname, MAX(CASE WHEN date_seq = 1 THEN "Date" END) AS Date1, MAX(CASE WHEN date_seq = 2 THEN "Date" END) AS Date2, MAX(CASE WHEN date_seq = 3 THEN "Date" END) AS Date3 FROM ( SELECT firstname, lastname, "Date", ROW_NUMBER() OVER (PARTITION BY firstname, lastname ORDER BY "Date") AS date_seq FROM your_table_name ) GROUP BY firstname, lastname ORDER BY firstname, lastname;
说明:
- 内层子查询同样为每个用户的日期生成序号
- 外层通过
CASE语句按序号筛选日期,再用MAX()聚合(确保每个用户只返回一行)
注意事项:
- 请将
your_table_name替换为你实际使用的表名 - 如果用户的日期数量超过3个,只需对应扩展
PIVOT中的序号或CASE语句即可
内容的提问来源于stack exchange,提问作者Mario
相关产品推荐
相关产品推荐

