我有一个需要在Azure SQL DW中将列值动态转换为列标题的要求

问题描述

表结构如下所示(记录总数达到150)

enter image description here

转置后,表结果集应如下所示,其中....代表n列数

enter image description here

基本上,我的想法是动态创建一个临时表,并从select语句定义其列名,以获取结果集,如图2所示。

查询应该类似于---

SELECT * INTO #Cols FROM (select * of above resultset)A WHERE 1=2

注意:-请不要使用FOR XML Path,因为Azure sql DW当前不支持功能

解决方法

我无法验证这项工作,但是,我的searchfu STRING_AGG在Azure数据仓库中可用。我假设它可以访问QUOTENAME,并且也可以访问dynamic statements,所以您可以执行以下操作:

DECLARE @SQL_Start nvarchar(4000) = N'SELECT ',@SQL_Columns nvarchar(4000),@SQL_End nvarchar(4000) = N'INTO SomeTable FROM YourTable WHERE 1 = 2;';

SET @SQL_Columns = (SELECT STRING_AGG(QUOTENAME(ColumnName),',') WITHIN GROUP (ORDER BY ColumnName)
                    FROM (SELECT DISTINCT ColumnName
                          FROM YourTable) YT);

EXEC(@SQL_Start + @SQL_Columns + @SQL_End);

但是,再次, real 解决方案是修复您的设计。