2015-01-11 2 views
2

Я запускаю следующий запрос в DB PostgreSQL, чтобы получить статус каждого канала в разные даты.Как добавить столбец в resultet для отображения count в PostgreSQL?

SELECT ch.name, 
    date(msg.date_created), 
    msg.status 
FROM message msg, 
channel ch 
WHERE msg.status !='TRANSFORMED' 
AND msg.channel_id = ch.id 
AND msg.date_created BETWEEN to_date('2015-01-10', 'YYYY-MM-DD') AND to_date('2015-01-11', 'YYYY-MM-DD'); 

Он извлекает данные в следующем формате:

Channel_Name,Date,Status 
CHANNEL_01,1/10/2015,SENT 
CHANNEL_04,1/10/2015,QUEUED 
CHANNEL_02,1/10/2015,QUEUED 
CHANNEL_02,1/10/2015,FILTERED 
CHANNEL_03,1/10/2015,QUEUED 
CHANNEL_02,1/10/2015,SENT 
CHANNEL_01,1/10/2015,SENT 
CHANNEL_03,1/10/2015,ERROR 
CHANNEL_01,1/10/2015,SENT 
CHANNEL_03,1/10/2015,SENT 
CHANNEL_03,1/10/2015,ERROR 
CHANNEL_04,1/10/2015,SENT 
CHANNEL_03,1/10/2015,SENT 
CHANNEL_03,1/10/2015,FILTERED 
CHANNEL_04,1/10/2015,ERROR 
CHANNEL_03,1/10/2015,SENT 
CHANNEL_03,1/10/2015,ERROR 
CHANNEL_03,1/10/2015,SENT 
CHANNEL_03,1/10/2015,FILTERED 
CHANNEL_03,1/10/2015,QUEUED 
CHANNEL_04,1/10/2015,FILTERED 

Но я хочу рассчитывать статус сообщения и отображения в колонке, сгруппированных по имени и дате. Как мне переписать запрос с помощью «group by» для достижения ожидаемого результата следующим образом?

Channel_Name,Date,SENT,QUEUED,ERROR,FILTERED 
CHANNEL_01,1/10/2015,3,0,0,0 
CHANNEL_02,1/10/2015,1,0,0,1 
CHANNEL_02,1/11/2015,0,1,0,0 
CHANNEL_03,1/10/2015,3,2,1,2 
CHANNEL_03,1/11/2015,1,0,2,0 
CHANNEL_04,1/10/2015,1,1,1,1 

ответ

4

Вы можете использовать SUM(CASE), повторить эту конструкцию для каждого значения состояния:

SELECT ch.name, 
    date(msg.date_created), 
    SUM(CASE WHEN msg.status = 'SENT' THEN 1 ELSE 0 END) as SENT, 
    ... -- same for other statuses 
FROM message msg, 
channel ch 
WHERE msg.status !='TRANSFORMED' 
AND msg.channel_id = ch.id 
AND msg.date_created BETWEEN to_date('2015-01-10', 'YYYY-MM-DD') AND to_date('2015-01-11', 'YYYY-MM-DD') 
GROUP BY ch.name, date(msg.date_created); 
+1

... или используйте 'COUNT (CASE WHEN msg.status = 'SENT' THEN 1 ELSE NULL END) as SENT ' –

+0

Спасибо Oleg & Todd. – Robie

1

В качестве промежуточного шага, вы можете GROUP BY ch.name, date(msg.date_created), msg.status и подсчитать количество сообщ на статус для каждого имени канала и даты, например:

SELECT ch.name, 
    date(msg.date_created), 
    msg.status, 
    COUNT(*) 
FROM message msg, 
channel ch 
WHERE msg.status !='TRANSFORMED' 
AND msg.channel_id = ch.id 
AND msg.date_created BETWEEN to_date('2015-01-10', 'YYYY-MM-DD') AND to_date('2015-01-11', 'YYYY-MM-DD') 
GROUP BY ch.name, date(msg.date_created), msg.status; 

Это должно дать вам выход в виде:

CHANNEL_01,1/10/2015,SENT,3 
CHANNEL_02,1/10/2015,QUEUED,1 
CHANNEL_02,1/11/2015,ERROR,1 

, который находится всего в нескольких шагах от окончательного желаемого результата.

+0

Единственный способ я вижу, чтобы превратить свой выход в то, что вы просили это запрос с 4 вложенных подзапросов для каждого из 4 типа статуса. – jaynp

+0

Мне действительно повезло. – Robie

Смежные вопросы