【问题标题】:How Do I Use PIVOT On This Data:?我如何在这些数据上使用 PIVOT:?
【发布时间】:2025-12-10 12:20:03
【问题描述】:

我有一个如下所示的 SQL Server 表:

RESOURCE |  DESCRIPTION | VALUE
Test A      Name        | Resource A-xyz
Test A   |  Height      | 20
Test A   |  Unit        | ft
Test A   |  Location    | Site 1
Test B   |  Volume      | 30
Test C   |  Width       | 10
Test C   |  Unit        | in

我想把它变成这种格式:

RESOURCE | Name           | Height | Unit | Location | Volume | Width
Test A   | Resource A-xyz | 20     | ft   | Site 1   |        |
Test B   |                |        |      |          |  30    |
Test C   |                |        | in   |          |        | 10

我遇到的一个问题是没有固定的描述模式;例如,资源“Test B”可能具有与“Test A”相同的所有描述,而“Test C”可能缺少一些描述,而“Test D”可能具有完全不同的集合。

到目前为止,Google 建议我要使用数据透视表,但我仍然不确定如何使用上述数据。

【问题讨论】:

    标签: sql sql-server pivot pivot-table


    【解决方案1】:

    生成的列列表基于您在PIVOT 中提供的顺序:

    SELECT *
    FROM Table1
    PIVOT(MAX(VALUE) FOR DESCRIPTION IN (Name,Height,Unit,Location,Volume,Width))p
    

    演示:SQL Fiddle

    如果您要更改 DESCRIPTION 的值,那么动态构建此查询是值得的,可以找到很多关于“动态枢轴”的好示例。

    【讨论】:

      【解决方案2】:

      试试这个代码:

      SELECT resource,Name,Height,Unit,Location,Volume,Width
      FROM 
      #T1 AS SourceTable
      PIVOT    
      (    
      max(value)    
      FOR description IN ([Name],[Height],[Unit],[Location],[Volume],[Width])    
      ) AS PivotTable 
      ORDER BY 1
      

      【讨论】:

        【解决方案3】:

        如果您不想对列进行硬编码并想即时生成相同的视图,您可以使用它。这将生成动态枢轴

        CREATE TABLE demo
        (
        RESOURCE VARCHAR(100),
        DESCRIPTION VARCHAR(100), VALUE VARCHAR(100)
        )
        
        INSERT INTO demo VALUES
        ('Test A'   ,  'Name'       , 'Resource A-xyz')
        ,('Test A'   ,  'Height'      , '20')
        ,('Test A'   ,  'Unit'     , 'ft')
        ,('Test A'   ,  'Location'   , 'Site 1')
        ,('Test B'   ,  'Volume'     , '30')
        ,('Test C'   ,  'Width'       , '10')
        ,('Test C'   ,  'Unit'        , 'in')
        
        
        SELECT DISTINCT DESCRIPTION  INTO #tbl FROM demo
        //Get list of values to be pivoted
        DECLARE @var NVARCHAR(1000)=''
        SELECT @var = @var +', ' + DESCRIPTION FROM #tbl 
        SELECT @var = SUBSTRING(@var, 2, LEN(@var))
        SELECT @var
        
        DECLARE @query NVARCHAR(2000) = 'SELECT * FROM demo PIVOT(MAX(VALUE) FOR DESCRIPTION IN ('+ @var + '))p'
        EXEC sp_executesql @query
        

        【讨论】:

          【解决方案4】:

          最后,我做了以下事情:

          1. 选择了所有不同的描述(超过 70 个!)。
          2. 创建了一个表,其中包含资源和每个不同的描述作为字段
          3. 填充的资源列不同的资源名称
          4. 跑了一系列 更新以填充每个不同资源的剩余列 名字。

          例如

          CREATE TABLE #tb1
          (
               [RESOURCE] varchar(100),
               [FIELD1]   varchar(100),
               [FIELD2]   varchar(50),
               .
               .
               .
               [LAST FIELD]  varchar(50),
          )
          
          INSERT INTO #tb1 (RESOURCE)
          SELECT DISTINCT RESOURCE FROM tb2
          ORDER BY Resource ASC
          
          UPDATE #tb1 SET [FIELD1] = (SELECT VALUE FROM tb2 WHERE Resource = #tb1.Resource and  Property = [FIELD1])
          .
          .
          .
          UPDATE #tb1 SET [LAST FIELD] = (SELECT VALUE FROM tb2 WHERE Resource = #tb1.Resource and  Property = [LAST FIELD])
          

          【讨论】: