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)

固定シリーズのシナリオでは、CROSSJOINの可能性もあります。

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 に答える