2014-04-14 22 views
0

我有一個看起來像這樣的SQL Server表:如何在此數據上使用PIVOT:?

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」可能具有完全不同的一組。

到目前爲止谷歌建議我想使用數據透視表,但我仍然不確定如何使用上述數據做到這一點。

回答

0

結果列清單是根據您提供的PIVOT內的順序:

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

演示:SQL Fiddle

如果你已經改變值DESCRIPTION是值得的動態建立這個查詢,有大量的'動態樞軸'被發現的很好的例子。

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 
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 
0

最後,我做了以下內容:(!超過70個)

  1. 全部選擇不同的描述。
  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])