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

如何通过单SQL查询结合关联实现数据逆透视(Unpivot)?

解决方案:SQL Server 逆透视关联生成目标结果集

完全可以通过单条SQL查询结合**逆透视(UNPIVOT)**和表关联实现,替代多条UNION语句的繁琐写法,具体实现如下:

核心SQL语句

SELECT 
    a.Site_Name,
    b.ColumnName,
    b.ColumnId,
    a.ColumnValue
FROM (
    -- 对TABLE A执行逆透视,将列转为行
    SELECT 
        Site_Name,
        ColumnName,
        ColumnValue
    FROM TABLE_A
    UNPIVOT (
        ColumnValue FOR ColumnName IN (Revenue, Expenses, MiscOverhead)
    ) AS unpvt
) AS a
-- 关联TABLE B获取对应的ColumnId
JOIN TABLE_B AS b ON a.ColumnName = b.ColumnName
ORDER BY a.Site_Name, b.ColumnName;

代码说明

  1. 逆透视(UNPIVOT):将TABLE A中Revenue、Expenses、MiscOverhead这些列转换为两行数据——ColumnName(列名)和ColumnValue(对应值),每个Site_Name会生成3条行记录。
  2. 表关联:将逆透视后的结果与TABLE B通过ColumnName字段关联,直接匹配获取对应的ColumnId。
  3. 排序:通过ORDER BY保证结果按站点和指标名称有序,和目标输出结构一致。

扩展说明

如果TABLE A的指标列后续可能新增,不想每次修改SQL语句,可以改用动态SQL生成UNPIVOT的列列表,避免硬编码:

DECLARE @cols NVARCHAR(MAX);
DECLARE @sql NVARCHAR(MAX);

-- 从TABLE B动态获取需要逆透视的列名
SELECT @cols = STRING_AGG(QUOTENAME(ColumnName), ', ') FROM TABLE_B;

SET @sql = N'
SELECT 
    a.Site_Name,
    b.ColumnName,
    b.ColumnId,
    a.ColumnValue
FROM (
    SELECT 
        Site_Name,
        ColumnName,
        ColumnValue
    FROM TABLE_A
    UNPIVOT (
        ColumnValue FOR ColumnName IN (' + @cols + N')
    ) AS unpvt
) AS a
JOIN TABLE_B AS b ON a.ColumnName = b.ColumnName
ORDER BY a.Site_Name, b.ColumnName;';

EXEC sp_executesql @sql;

这种写法会自动读取TABLE B中的所有ColumnName,无需手动维护逆透视的列列表,扩展性更强。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.18 15:10:23