如何在此数据上使用PIVOT:?

时间:2014-04-14 17:52:36

标签: sql sql-server pivot pivot-table

我有一个如下所示的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

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

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

4 个答案:

答案 0 :(得分:0)

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

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

演示:SQL Fiddle

如果您更改了DESCRIPTION的值,那么动态构建此查询是值得的,有很多很好的示例可以找到“动态数据透视”。

答案 1 :(得分:0)

试试这段代码:

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

答案 2 :(得分:0)

如果您不想对列进行硬编码并希望动态生成相同的视图,则可以使用此功能。这将生成动态数据透视

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

答案 3 :(得分:0)

最后,我做了以下事情:

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

    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])