2015-04-21 63 views
0

我有這種情況,我認爲最好的解決方案是使用透視功能,但我真的不知道該怎麼做。或者,也許有一個更好的方法來做到這一點...沒有聚合和多個數據透視列的樞軸表

我得到這個表作爲源:

ID | version | code | property | value 
-----|---------|------|----------|------ 
    110|  1| AA|  prop1| 10 
    110|  1| AA|  prop2| 20 
    110|  1| AA|  prop3| 30 
    110|  1| BB|  prop1| 10 
    110|  1| BB|  prop2| 40 
    110|  1| BB|  prop3| 20 
    110|  2| AA|  prop1| 50 
    120|  1| BB|  prop2| 60 
    120|  2| AA|  prop3| 80 

我想落得如下:

ID | version | code | prop1 | prop2 | prop3 
-----|---------|------|-------|-------|------ 
    110|  1| AA|  10|  20| 30 
    110|  1| BB|  10|  40| 20 
    110|  2| AA|  50|  |  
    120|  1| BB|  |  60|  
    120|  2| AA|  |  | 80 

所以你看我沒有做聚合,只是對前三張桌子的一個支點。 難道這更多鈔票在TSQL,我使用的是SQL Server 2012的

+0

是否總是'prop1','prop2'和'prop3'? –

+1

如果每個組中最多隻有一個值,並且您選擇一個聚合(如果提供了單個值),則返回相同的值 - 例如「SUM」,「MIN」或「 'MAX'(我通常更喜歡後兩種,因爲它們適用於更廣泛的類型) –

+0

@wewesthemenace是的,柱可以是靜態的 – NCS

回答

2

你想上進行分組編號,版本和代碼,因此它是簡單的數據透視:

Select * from TableName 
pivot(max(value) for property in([prop1],[prop2],[prop3]))p 

如果表中有多個列,那麼你將需要先挑右列:

;with cte as(Select id, version, code, property, value from TableName) 
Select * from cte 
pivot(max(value) for property in([prop1],[prop2],[prop3]))p 
1

如果property總是prop1prop2prop3,你可以做到這一點使用條件彙總:

SELECT 
     ID 
    , Version 
    , Code 
    , MAX(CASE WHEN Property = 'prop1' THEN VALUE END) AS [prop1] 
    , MAX(CASE WHEN Property = 'prop2' THEN VALUE END) AS [prop2] 
    , MAX(CASE WHEN Property = 'prop3' THEN VALUE END) AS [prop3] 
FROM SampleData 
GROUP BY ID, Version, Code 

這裏是一個動態的方法。請閱讀article以供參考。

SQL Fiddle

DECLARE @sql1 VARCHAR(4000) = '' 
DECLARE @sql2 VARCHAR(4000) = '' 
DECLARE @sql3 VARCHAR(4000) = '' 

SELECT @sql1 = 
'SELECT 
     ID 
    , Version 
    , Code 
' 

SELECT @sql2 = @sql2 + 
' , MAX(CASE WHEN Property = ''' + Property + ''' THEN VALUE END) AS [' + Property + ']' + CHAR(10) 
FROM(
    SELECT DISTINCT Property FROM SampleData 
)t 
ORDER BY Property 

SELECT @sql3 = 
'FROM SampleData 
GROUP BY ID, Version, Code 
ORDER BY ID, Version, Code' 

PRINT(@sql1 + @sql2 + @sql3) 
EXEC (@sql1 + @sql2 + @sql3) 
1
declare @t table (Id int,version int,code varchar(10),property varchar(10),val int) 
insert into @t (Id,version,code,property,val)values (110,1,'AA','prop1',10), 
(110,1,'AA','prop2',20),(110,1,'AA','prop3',30),(110,1,'BB','prop1',10), 
(110,1,'BB','prop2',40),(110,1,'BB','prop3',20),(110,2,'AA','prop1',50),(120,1,'BB','prop2',60), 
(120,1,'AA','prop3',80) 


select Id,version,code,[prop1],[prop2],[prop3] 
    from (
select ID,version,code,property,val 
    from @t)t 
PIVOT(SUM(val)FOR Property IN ([prop1],[prop2],[prop3]))p