【问题标题】:How to use column value as column header?如何使用列值作为列标题?
【发布时间】:2012-03-19 01:55:55
【问题描述】:

我有一张这样的桌子:

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

【问题讨论】:

  • 快速路过提示解决方案 - 使用带有 for 循环的存储过程来生成视图怎么样?

标签: sql pivot-table


【解决方案1】:

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

SQL Server 2005 Pivot on Unknown Number of Columns

【讨论】:

    【解决方案2】:

    这可以使用动态 SQL 来构建数据透视语句来完成。尴尬,丑陋,但它可以工作,并且可以非常有效地工作。详情请查看我对this question 的第一个回复。

    【讨论】:

      【解决方案3】:

      以下内容已在 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
      

      注意 - 如果您有大量数据,并且有很多列,这可能会变得低效

      【讨论】:

        猜你喜欢
        • 2018-08-15
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多