2012-08-02 97 views
1

我正在使用sql server 2008數據庫。Sql查詢來選擇值並按系列對它們進行分組

我有這樣的」

Id  Year Series Value 
----+------+--------+------ 
1  1990 a  1.5 
1  1990 b  1.6 
1  1990 c  1.7 
1  1991 a  1.8 
1  1991 b  1.9 
1  1991 c  2.5 

表是否有可以選擇的值和這樣回報他們的查詢?

Year a  b  c 
------+------+--------+------ 
1990 1.5 1.6  1.7 
1991 1.8 1.9  2.5 

非常感謝任何幫助。

+1

是系列值(A,B ,c)一個固定的設置或可以'系列'採取額外的價值? – 2012-08-02 13:51:35

+0

可能有其他系列,但我只對a,b和c感興趣,所以我們可以考慮將它們修復 – Youssef 2012-08-02 14:02:35

+0

,那麼Ivan G就有了答案。 – 2012-08-02 14:07:59

回答

3

如果系列固定爲a,b,c,您可以這樣做:

CREATE TABLE #t (Id INT, Year INT, 
    Series VARCHAR(5), Value DECIMAL(10,1)) 
INSERT #t 
VALUES 
(1,  1990, 'a',  1.5), 
(1,  1990, 'b',  1.6), 
(1,  1990, 'c',  1.7), 
(1,  1991, 'a',  1.8), 
(1,  1991, 'b',  1.9), 
(1,  1991, 'c',  2.5) 

SELECT pvt.Year, 
     pvt.a, 
     pvt.b, 
     pvt.c 
FROM #t 
PIVOT (
    MIN(Value) FOR Series IN ([a], [b], [c]) 
) pvt 

如果將其他的值,你可以使用動態透視:

DECLARE @series VARCHAR(100) = 
    STUFF((SELECT DISTINCT ',[' + Series + ']' 
      FROM #t 
      FOR  XML PATH('')) 
      ,1, 1, '') 

DECLARE @query VARCHAR(2000) = ' 
SELECT pvt.Year, ' + @series +' 
FROM #t 
PIVOT (
    MIN(Value) FOR Series IN (' + @series + ') 
) pvt 
'; 

EXEC(@query) 

在有固定系列的場景,也有交叉的可能性JOIN:

SELECT a.Year, 
     MAX(CASE WHEN a.Series = 'a' THEN a.Value END) a, 
     MAX(CASE WHEN a.Series = 'b' THEN a.Value END) b, 
     MAX(CASE WHEN a.Series = 'c' THEN a.Value END) c 
FROM #t a 
CROSS JOIN #t b 
GROUP BY a.Id, a.Year 
ORDER BY a.Year