我想将源格式的数据转换为目标格式。
来源格式:
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.谢谢
答案 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);