2016-09-29 5 views
0

私は以下のような表を持っています。 ID2の各別個の値と時刻に(0,1,2,3,4)のID3を持つ行を選択する必要があります。次に、5つの列に 'Val'を表示し、空の列に0を入力します。 すなわちMySQL GROUP BY列と異なる列に値を表示

ID1 ID2 ID3 Val Time 
    1 224 0 224 10 
    2 224 1 48 10 
    3 224 4 270 15 
    4 224 5 1000 27 
    5 225 0 231 10 
    6 225 1 400 10 
    7 225 0 100 20 

(ID3 = 1次に、COL1 =ヴァル場合ID3 = 0次いでCOL0 =ヴァル 場合、そして、...)、出力は以下の(ID2、時間によってグループ)のようにすべきです:

ID2 Time col0 col1 col2 col3 col4 
    224 10 224 48 0 0  0 
    224 15 0 0  0 0 270 
    225 10 231 400 0 0  0 
    225 20 100 0  0 0  0 

注:表には50M行があります。

答えて

2
select id2, time, 
     sum(case when id3 = 0 then val else 0 end) as col0, 
     sum(case when id3 = 1 then val else 0 end) as col1, 
     sum(case when id3 = 2 then val else 0 end) as col2, 
     sum(case when id3 = 3 then val else 0 end) as col3, 
     sum(case when id3 = 4 then val else 0 end) as col4 
from your_table 
group by id2, time 
having sum(val) > 0 
+0

ありがとうございます。私は 'then'の後に 'id3'を 'Val'に置き換えるべきだと思います。 col0からcol4の値がゼロの行を削除する条件を設定すると、より良い結果が得られます。また、時間の複雑さを軽減するためにこのクエリを最適化するにはどうすればいいでしょうか。 – YNr

+0

あなたは正しいです、私は 'id3'を' val'に変更しました。また、それらの '0'の結果を削除するために' having'節を追加しました。 –