将动态 JOIN 与 GROUP BY 结合使用

Using dynamic JOIN with GROUP BY

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

源格式:

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。谢谢

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

下面是您如何操作的示例。

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);