将动态 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);
我想将源格式的数据转换成目标格式。
源格式:
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);