2014-02-18 8 views
-1

我有一個看起來像SQL高大表到透視表

ID | Version | Date | Value | Value Type 
1 | 1  | 2012 | 1  | x 
1 | 1  | 2012 | 1.5 | y 
1 | 2  | 2012 | 2.3 | x 
1 | 2  | 2012 | 1.7 | y 

我想輸出看起來像

ID | Version | Date | X | Y 
1 | 1  | 2012 | 1 | 1.5 
1 | 2  | 2012 | 2.3 | 1.7  

感謝的ouptut!

+0

? – Shiva

回答

3

由於您使用的是SQL Server,因此您可以通過多種方式獲得結果。

可以使用聚合函數CASE表達式:

select id, version, date, 
    max(case when valuetype = 'X' then value end) X, 
    max(case when valuetype = 'Y' then value end) Y 
from yourtable 
group by id, version, date; 

SQL Fiddle with Demo

從SQL Server 2005開始,引入了PIVOT功能。如果你有值的數量有限,那麼你可以硬編碼查詢:

select id, version, date, X, Y 
from 
(
    select id, version, date, valuetype, value 
    from yourtable 
) d 
pivot 
(
    max(value) 
    for valuetype in (X, Y) 
) p; 

SQL Fiddle with Demo。最後,如果你有一個未知的數值,那麼你就需要使用動態SQL來得到結果:

DECLARE @cols AS NVARCHAR(MAX), 
    @query AS NVARCHAR(MAX) 

select @cols = STUFF((SELECT ',' + QUOTENAME(ValueType) 
        from yourtable 
        group by ValueType 
        order by ValueType 
      FOR XML PATH(''), TYPE 
      ).value('.', 'NVARCHAR(MAX)') 
     ,1,1,'') 

set @query = N'SELECT id, version, date,' + @cols + N' 
      from 
      (
       select id, version, date, valuetype, value 
       from yourtable 
      ) x 
      pivot 
      (
       max(value) 
       for valuetype in (' + @cols + N') 
      ) p ' 

execute sp_executesql @query; 

SQL Fiddle with Demo您正在使用哪種關係數據庫

+0

Microsoft sql server – MathLover

+0

另外,如果實際上有25個案例呢?我只放了X和Y,但實際上還有更多 – MathLover

+0

@MathLover如果你有25個案例,那麼你要麼必須對查詢進行硬編碼,要麼使用動態SQL - 請參閱我在編輯部分中使用exampless – Taryn