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

无PIVOT权限时,如何在SQL或Excel中实现数据转置?

没问题,我来给你两种不用PIVOT的解决方案——分别是SQL端和Excel端的,都能实现你要的行转列效果,让每个ID只保留一行记录:

SQL解决方案(无需PIVOT)

因为权限限制用不了PIVOT,我们可以用条件聚合+行号排序的思路来实现:

  1. 先给每个ID下的Type按出现顺序分配一个序号(用ROW_NUMBER()函数);
  2. 再用CASE配合聚合函数(比如MAX)把不同序号的Type映射到对应的One、Two、Three列。

具体SQL代码如下:

SELECT
    ID,
    MAX(CASE WHEN rn = 1 THEN Type END) AS One,
    MAX(CASE WHEN rn = 2 THEN Type END) AS Two,
    MAX(CASE WHEN rn = 3 THEN Type END) AS Three
FROM (
    -- 子查询:给每个ID的Type按顺序编号
    SELECT 
        ID,
        Type,
        ROW_NUMBER() OVER (PARTITION BY ID ORDER BY Type) AS rn
    FROM your_table -- 这里替换成你的实际表名
) t
GROUP BY ID

解释一下:

  • ROW_NUMBER() OVER (PARTITION BY ID ORDER BY Type):按ID分组,给每组内的Type排序并分配序号(如果不需要按Type排序,可以去掉ORDER BY Type,或者换成你需要的排序字段);
  • 外层的CASE会根据序号提取对应位置的Type,MAX函数用来把每个ID的多行记录聚合为一行,没有对应值的位置会自动显示NULL,完全符合你的需求。
Excel解决方案

如果用Excel处理,分两种方法,适配不同版本:

方法1:动态数组公式(适合Excel 365/2021及以上)

这种方法操作简单,步骤如下:

  1. 提取唯一ID:在空白单元格(比如D2)输入=UNIQUE(A:A),按回车,会自动生成所有不重复的ID列表;
  2. 提取对应列的值:
    • One列(第一个Type):在E2输入=IFERROR(INDEX(FILTER($B:$B,$A:$A=D2),1),"Null")
    • Two列(第二个Type):在F2输入=IFERROR(INDEX(FILTER($B:$B,$A:$A=D2),2),"Null")
    • Three列(第三个Type):在G2输入=IFERROR(INDEX(FILTER($B:$B,$A:$A=D2),3),"Null")
  3. 选中E2:G2,下拉填充公式,就能得到你要的结果。

方法2:传统数组公式(兼容所有Excel版本)

如果你的Excel版本不支持动态数组,可以用这种方法:

  1. 提取唯一ID:在D2输入=INDEX($A:$A, MATCH(0, COUNTIF($D$1:D1, $A:$A), 0)),然后按下Ctrl+Shift+回车(必须用数组公式触发),下拉直到出现#N/A为止;
  2. 提取对应列的值:
    • One列:在E2输入=IFERROR(INDEX($B:$B, SMALL(IF($A:$A=D2, ROW($A:$A)-ROW($A$1)+1), 1)),"Null"),按下Ctrl+Shift+回车后下拉;
    • Two列:把E2公式里的1改成2,即=IFERROR(INDEX($B:$B, SMALL(IF($A:$A=D2, ROW($A:$A)-ROW($A$1)+1), 2)),"Null"),同样按数组公式操作后下拉;
    • Three列:把公式里的2改成3即可。

内容的提问来源于stack exchange,提问作者user9654397

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 04:16:33