在GROUP BY中使用动态JOIN

时间:2016-09-14 00:02:47

标签: sql-server dynamic-sql

我想将源格式的数据转换为目标格式。

来源格式:

OBJECT  PROPERTY  VALUE
M1      P1        V1
M1      P2        NULL
M2      P1        V2
M2      P1        V6
M2      P2        V3
M2      P2        V4
M2      P2        V5

目标格式:

OBJECT  P1  P2  
M1      V1  NULL
M2      V6  V3
M2      V6  V4
M2      V6  V5    
M2      V2  V3                
M2      V2  V4
M2      V2  V5

我没有成功使用PIVOT语句。它必须是动态PIVOT,因为在运行时之前值是未知的。任何帮助表示赞赏。我使用SQL Server 2014.谢谢

1 个答案:

答案 0 :(得分:1)

因此,您实际上只是在寻找动态连接(因为每个值都使用不同的属性连接到彼此的值),而不是透视。

这是一个如何做到这一点的例子。

DECLARE @SQL NVARCHAR(MAX);

DECLARE @cols NVARCHAR(MAX) = '', @joins NVARCHAR(MAX) = '';

SELECT @cols += ', T' + RN + '.[Value] ' + QUOTENAME([Property])
     , @joins += CHAR(10) + 'LEFT JOIN (SELECT [Value], [Object] FROM sourceTable WHERE [Property] = ''' + [Property] + ''') T' + RN + ' ON T1.[Object] = T' + RN + '.[Object]'
FROM (SELECT [Property], CAST(ROW_NUMBER() OVER (ORDER BY [Property]) + 1 AS VARCHAR(50)) RN FROM sourceTable GROUP BY [Property]) T;

SELECT @SQL = 'SELECT T1.[Object]' + @cols +
'FROM (SELECT [Object] FROM sourceTable GROUP BY [Object]) T1' + @joins;

PRINT @SQL;
EXEC(@SQL);