2016-09-29 2 views
0

У меня есть таблица, как показано ниже. Он требуется для каждого отдельного значения ID2 и Time для выбора строк, которые имеют ID3 в (0,1,2,3,4). Затем я хочу показать «Val» в 5 столбцах и заполнить пустые столбцы нулем. (Если ID3 = 0, то col0 = Вал Если ID3 = 1, то col1 = Val, и ...)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

спасибо. Я думаю, что после «then», «id3» следует заменить на «Val». Если мы установим условие, которое удалит строки, которые имеют нулевые значения для col0 в col4, было бы лучше. Кроме того, мне интересно, как я могу оптимизировать этот запрос, чтобы сократить временную сложность. – YNr

+0

Вы правы, я изменил 'id3' на' val'. Также я добавил предложение 'having', чтобы удалить эти результаты' 0'. –