1

我正在开发一个 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

非常感谢您的帮助。

4

1 回答 1

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
于 2012-08-02T13:56:30.473 回答