我有一张这样的表:
ItemID PartID PartName PartValue
1 1 N1 v1
1 2 N2 v2
1 3 N3 v3
...
2 1 N1 u1
2 2 N2 u2
2 3 N3 u3
...
我可以使用sql select语句获取下表吗?
ItemID N1 N2 N3 ...
1 v1 v2 v3 ...
2 u1 u2 u3 ...
...
问题是我不知道有多少部件名称,所以可能还有n4,n5,n6 ...所以需要动态选择。我看到一些透视示例,但看起来当我知道有多少部件名称时可以使用它。如果我不知道,我该如何处理?谢谢!
答案 0 :(得分:2)
如果无法预定义输出中的列,则PIVOT不合适。相反,动态SQL(通常应避免使用)是一种前进的方式。
答案 1 :(得分:1)
可以使用动态SQL来构建pivot语句。笨拙,丑陋,但它有效,并且可以非常有效地工作。有关详细信息,请查看我对this question的第一个回答。
答案 2 :(得分:1)
以下内容已经在SQL-Server中进行了测试,但我认为这些主体可以应用于您正在使用的任何RDBMS。
CREATE TABLE #t (ItemID INT, PartID INT, PartName VARCHAR(2), PartValue VARCHAR(2))
INSERT #t VALUES (1, 1, 'N1', 'V1'), (1, 2, 'N2', 'V2'), (1, 3, 'N3', 'V3'), (2, 1, 'N1', 'V1'), (2, 2, 'N2', 'V2'), (2, 3, 'N3', 'V3')
DECLARE @SQL VARCHAR(MAX)
SELECT @SQL = ISNULL(@SQL, '') +
', ( SELECT PartValue
FROM #t t' + Rownum + '
WHERE t' + Rownum + '.ItemID = t.ItemID
AND t' + Rownum + '.PartName = ''' + PartName + '''
) [' + PartName + ']'
FROM ( SELECT PartName, CONVERT(VARCHAR, ROW_NUMBER() OVER (ORDER BY PartName)) [RowNum]
FROM #t
GROUP BY PartName
) d
SET @SQL = 'SELECT ItemID' + @SQL + ' FROM (SELECT DISTINCT ItemID FROM #t) t'
EXEC (@SQL)
DROP TABLE #t
注意 - 如果您拥有大量数据,这很可能效率低下