2010-08-20 3 views
0

Итак, придумывая название для этого трудноMySQL: запрос для сортировки данных на основе атрибута другого столбца

SELECT Date(p.born_at), SUM(p.value) as 'total_value_for_day' 
FROM puppies as p 
WHERE p.status = 2 
GROUP BY DATE(p.born_at); 

Таким образом, это дает результат в 2 колонки.

То, что я хочу это:

колонны:

date | status = 1 | status = 2 | status = 3 
DATA!!! 

есть способ сделать это?

+0

Вы можете уточнить результат, который вы хотите? Похоже, вам нужны 4 столбца, первая - дата, а для следующих трех столбцов вам нужны данные для состояния соответствия. Поэтому, если статус = 3, например, заполнить данные в этом столбце. Это верно? Это действительно прояснит ваш вопрос, если вы представили пример вывода с готовыми данными. – dvanaria

ответ

1
SELECT Date(p.born_at), 
SUM(case when status = 1 then p.value end) as 'status = 1', 
SUM(case when status = 2 then p.value end) as 'status = 2', 
SUM(case when status = 3 then p.value end) as 'status = 3' 
FROM puppies as p 
WHERE p.status in(1,2,3) 
GROUP BY DATE(p.born_at); 
+0

лучше использовать ГДЕ или не использовать ГДЕ? – NullVoxPopuli

+0

Зависит от ваших данных! Использование 'WHERE' потенциально может избежать обработки ненужных строк, если у вас есть те, где статус не равен 1,2 или 3. Если все строки имеют одно из этих значений, то, вероятно, лучше всего удалить его, чтобы избежать избыточной проверки , –

1
SELECT Date(born_at), 
    SUM(case when Status = 1 then value else 0 end) as 'status = 1', 
    SUM(case when Status = 2 then value else 0 end) as 'status = 2', 
    SUM(case when Status = 3 then value else 0 end) as 'status = 3' 
FROM puppies 
GROUP BY DATE(born_at); 
+0

лучше использовать ГДЕ или не использовать ГДЕ? – NullVoxPopuli

+0

Если у вас есть более 3 возможных статусов, я бы использовал предложение WHERE. Непонятно из вашего вопроса ... – RedFilter

+0

(Как сказал Мартин :)) – RedFilter

1
SELECT 
    DATE(p.born_at) 
    , SUM(CASE WHEN STATUS = 1 THEN p.value END) AS 'Status = 1' 
    , SUM(CASE WHEN STATUS = 2 THEN p.value END) AS 'Status = 2' 
    , SUM(CASE WHEN STATUS = 3 THEN p.value END) AS 'Status = 3' 
FROM puppies AS p 
WHERE p.status IN(1, 2, 3) 
GROUP BY DATE(p.born_at); 
Смежные вопросы