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

如何在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.26 03:12:59