Sql查询选择值并按系列分组

时间:2012-08-02 13:24:26

标签: sql-server-2008

我正在研究sql server 2008数据库。

我有一张这样的表“

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 个答案:

答案 0 :(得分: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)

在具有固定系列的场景中,还有可能使用CROSS 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