2016-09-29 79 views
0

我有一個表如下。對於每個不同的ID2值和時間來說,都需要選擇在(0,1,2,3,4)中具有ID3的行。然後,我想在5列中顯示'Val',並用零填充空列。 (如果ID3 = 0,那麼COL0 =纈氨酸 如果ID3 = 1,則COL1 =纈氨酸,和...)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 

換句話說,輸出應該是如下(由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

謝謝。我認爲在'之後','id3'應該被'Val'替代。如果我們設置一個條件,將col0的值爲零的行刪除到col4,那會更好。此外,我想知道如何優化此查詢以減少時間複雜性。 – YNr

+0

你說得對,我把'id3'改成了'val'。此外,我添加了一個「有」條款來刪除這些'0'結果。 –