0

私はこのテーブルを持っています:

 __________________________
| id1 | id2 | count | time |
|-----|-----|-------|------| 
| abc | def |   10  |   3  |
| abc | def |   5   |   1  |
| ghi | jkl |   2   |   3  |
+--------------------------+

id1 と id2 は varchar、count は int、time は int です。

id1 と id2 を合わせて主キーを作成します。

アイテムがいつ追加されたかに応じて、時間は 1、2、3、4、または 5 になります (一意ではありません)。

代わりに、この出力を提供するクエリを作成したいと思います。

 _________________________________________
| id1 | id2 |  1  |  2  |  3  |  4  |  5  |
|-----|-----|-----|-----|-----|-----|-----| 
| abc | def |  5  |  0  |  10 |  0  |  0  |
| ghi | jkl |  0  |  0  |  2  |  0  |  0  |
+-----------------------------------------+

それは可能ですか?ここに座って頭をかきむしっているのですが、よくわかりません!

4

2 に答える 2

2

あなたは運がいいです。ピボットのルールは、結果セット内の列の数と名前を知っている必要があるということです。クエリを実行するときにそれらを調べる必要はありません。それがわかっていれば大丈夫です。この場合、列は 1 から 5 の範囲に制限されています。

このようにピボットするにはいくつかの方法があります。私はまだ sum(case) メソッドを好みます:

select id1, id2, 
    sum(case when time = 1 then [count] else 0 end) "1",
    sum(case when time = 2 then [count] else 0 end) "2",
    sum(case when time = 3 then [count] else 0 end) "3",
    sum(case when time = 4 then [count] else 0 end) "4",
    sum(case when time = 5 then [count] else 0 end) "5"
from [table]
group by id1, id2

もう 1 つのオプションはPIVOTキーワードです。

select id1,id2,[1],[2],[3],[4],[5] 
from [table]
PIVOT ( SUM([count]) FOR time IN ([1],[2],[3],[4],[5]) ) As Times
于 2013-06-17T13:46:57.447 に答える
0

このようなもの:

select ID1, ID2, 
sum(f1) as '1',
sum(f2) as '2',
sum(f3) as '3',
sum(f4) as '4',
sum(f5) as '5'
from (  select ID1, ID2,
        case when time =1 then time else 0 end as 'f1',
        case when time =2 then time else 0 end as 'f2',
        case when time =3 then time else 0 end as 'f3',
        case when time =4 then time else 0 end as 'f4',
        case when time =5 then time else 0 end as 'f5'
        from dbo._Test
    ) as v
group by ID1, ID2

内側のクエリは各時間値の列を提供し、外側のクエリは値を合計するため、「abc」+「def」行の 2 つの行を取得しません。

于 2013-06-17T13:53:46.403 に答える