如何使用列值作为列标题?

时间:2012-02-29 15:06:19

标签: sql pivot-table

我有一张这样的表:

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 ...所以需要动态选择。我看到一些透视示例,但看起来当我知道有多少部件名称时可以使用它。如果我不知道,我该如何处理?谢谢!

3 个答案:

答案 0 :(得分:2)

如果无法预定义输出中的列,则PIVOT不合适。相反,动态SQL(通常应避免使用)是一种前进的方式。

请参阅SQL Server 2005 Pivot on Unknown Number of Columns

答案 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

注意 - 如果您拥有大量数据,这很可能效率低下