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

MS SQL多id列长表转宽表的PIVOT通用实现方案咨询

多ID列PIVOT转宽表通用方案

核心逻辑:PIVOT转换时的待旋转列值需要和动态生成的列名完全匹配,你只需要将多个_id字段拼接为同一个标识字段,再用该字段作为PIVOT的旋转维度即可,该方案可以直接扩展到N个_id字段的场景。

修正后的动态SQL代码

declare @cols nvarchar(max);
declare @sql  nvarchar(max);

-- 生成动态列名:多个_id字段按自定义规则拼接即可
select @cols = stuff((
    select distinct ', ' + 'VarA_'+convert(varchar(10),varA_id) + '_VarB_'+convert(varchar(10),varB_id)
    from t
    order by 1
    for xml path (''), type).value('.','nvarchar(max)')
,1,2,'')

set @sql = '
select Id, date, ' + @cols + '
from (
    select 
        Id, 
        date,
        -- 此处拼接规则必须和上方生成列名的规则完全一致
        pivot_col = ''VarA_''+convert(varchar(10),varA_id) + ''_VarB_''+convert(varchar(10),varB_id),
        value
    from t
) as source
pivot (
    sum([value]) 
    for pivot_col in (' + @cols + ') 
) as pivot_result'

exec(@sql);

多ID字段扩展方法

如果你的业务表有3个甚至更多_id字段(例如新增varC_id),仅需修改两处拼接规则即可适配:

  • 动态列名生成部分的拼接逻辑,新增对应_id字段的拼接规则
  • 子查询中pivot_col字段的拼接逻辑和列名生成规则保持完全一致

注意事项

如果业务表不需要保留id、date这类非聚合维度字段,直接在子查询和外层select语句中删除对应字段即可,PIVOT会自动按剩余的非旋转、非聚合字段分组。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.24 15:24:04