2013-03-15 2 views
0

Я пытаюсь сделать отчет для статуса электронной почты, и мне нужно вести учет ежемесячно.Группа с несколькими столбцами даты

Вот моя структура таблицы данных:

sent_on date; 
sent boolean; 
open date; 
clicked date; 

Окончательный вывод, который я ожидал бы:

Month | Year | Sent Count | Open Count | Clicked Count 

Я знаю, что я могу это сделать, если я сделаю отдельное заявление, такие как

Select MONTH(sent_on), YEAR(sent_on), count(sent_on) FROM my_table 
WHERE sent = true; 

Select MONTH(open), YEAR(open), count(open) FROM my_table; 

Select MONTH(clicked), YEAR(clicked), count(clicked) FROM my_table; 

Можете ли вы, ребята, помочь мне в этом и предоставить любые простые идеи? Я уверен, что я что-то упустил. пса с помощью SQL ЗДЕСЬ

+0

Что СУБД ты используешь? –

+0

Нет, это дата. Нам нужно было знать, КОГДА было открыта/нажата электронная почта, поэтому мы выбрали ее как дату. – Milan

+0

@ Lieven Мы используем POSTGRESQL. – Milan

ответ

1

SQL Fiddle

select 
    date_trunc('month', d) "month", 
    count(sent and sent_on = d or null) sent_on, 
    count(open = d or null) open, 
    count(clicked = d or null) clicked 
from 
    t 
    inner join 
    generate_series(
     (select least(min(sent_on), min(open), min(clicked)) from t), 
     (select greatest(max(sent_on), max(open), max(clicked))from t) 
     , '1 day' 
    ) s(d) on s.d in (t.sent_on, t.open, t.clicked) 
group by 1 
order by 1 
+0

@user Отредактировано, чтобы сделать его группой по месяцам вместо дня. –

+0

@user Новое изменение учетной записи 'sent' boolean. –

+0

Заявления 'count' неверны. 'sd in (t.sent_on, t.open, t.clicked)' присоединяется к записи с 'sd = '1/1/2013' sent_on = '1/1/2013' open = '2/2/2013' 'и' count (open) 'будет считать эту запись (' '2/2/2013'') за период '' */1/2013''. –

0

Не necessarly производительного кода:

SELECT m, y, sent_count, open_count, clicked_count 
FROM 
    (SELECT MONTH(sent_on) as m, YEAR(sent_on) as y 
    FROM my_table 
    WHERE sent = true 
    GROUP BY MONTH(sent_on), YEAR(sent_on) 
    UNION ALL 
    SELECT MONTH(open), YEAR(open) 
    FROM my_table 
    WHERE sent = true 
    GROUP BY MONTH(open), YEAR(open) 
    UNION ALL 
    SELECT MONTH(open), YEAR(open) 
    FROM my_table 
    WHERE sent = true 
    GROUP BY MONTH(open), YEAR(open)) d 
LEFT JOIN 
(Select MONTH(sent_on) as m , YEAR(sent_on) as y, count(sent_on) sent_count 
FROM my_table 
WHERE sent = true 
GROUP BY MONTH(sent_on), YEAR(sent_on)) s on (s.y=d.y and s.m=d.m) 
LEFT JOIN 
(Select MONTH(open) as m , YEAR(open) as y, count(open) open_count 
FROM my_table 
WHERE sent = true 
GROUP BY MONTH(open), YEAR(open)) o on (o.y=d.y and o.m=d.m) 
LEFT JOIN 
(Select MONTH(clicked) as m , YEAR(clicked) as y, count(clicked) clicked_count 
FROM my_table 
WHERE sent = true 
GROUP BY MONTH(clicked), YEAR(clicked)) c on (c.y=d.y and c.m=d.m); 

ПРЕДПОЛАГАЛСЯ открытым и щелкнул отправляются.

UPDATE: Для выполнения мы можем начать форму folowing запроса:

Select MONTH(sent_on) sm, YEAR(sent_on) sy, 
     MONTH(OPEN) om, YEAR(OPEN) oy, 
     MONTH(clicked) cm, YEAR(clicked) cy, 
     count(sent_on) sent_cnt, count(clicked) clicked_cnt, count(open) open_cnt 
FROM my_table 
WHERE sent = true 
GROUP BY MONTH(sent_on), YEAR(sent_on), 
     MONTH(OPEN), YEAR(OPEN), 
     MONTH(clicked), YEAR(clicked); 
+0

Я действительно пытался добиться этого через стол в одном сканере. Иначе, как я сказал в родительском комментарии, я бы сделал три разных выбора. – Milan

+0

Я попробую выполнить одно сканирование. –

0

UNPIVOT даты, а затем сгруппировать результаты условно:

SELECT 
    MONTH(eventdate) AS Month, 
    YEAR (eventdate) AS Year, 
    COUNT(CASE eventkind WHEN 'sent_on' THEN 1 END) AS SentCount, 
    COUNT(CASE eventkind WHEN 'open' THEN 1 END) AS OpenCount, 
    COUNT(CASE eventkind WHEN 'clicked' THEN 1 END) AS ClickedCount 
FROM (
    SELECT 
    x.eventkind, 
    CASE x.eventkind 
     WHEN 'sent_on' THEN sent_on 
     WHEN 'open' THEN open 
     WHEN 'clicked' THEN clicked 
    END AS eventdate 
    FROM my_table AS t 
    CROSS JOIN (VALUES ('sent_on', 'open', 'clicked')) AS x (eventkind) 
    WHERE t.sent = true 
) AS s 
GROUP BY 
    MONTH(eventdate), 
    YEAR (eventdate) 
; 
Смежные вопросы