如何通过单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;
代码说明
- 逆透视(UNPIVOT):将TABLE A中
Revenue、Expenses、MiscOverhead这些列转换为两行数据——ColumnName(列名)和ColumnValue(对应值),每个Site_Name会生成3条行记录。 - 表关联:将逆透视后的结果与TABLE B通过
ColumnName字段关联,直接匹配获取对应的ColumnId。 - 排序:通过
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
相关产品推荐
相关产品推荐

