SQL-запрос для отчета о продажах по дате

У меня есть таблица потенциальных клиентов:

CREATE TABLE "lead" (
    "id" serial NOT NULL PRIMARY KEY,
    "marketer" varchar(500) NOT NULL,
    "date_set" varchar(500) NOT NULL
)
;
INSERT INTO lead VALUES (1, 'Joe', '05/01/13');
INSERT INTO lead VALUES (2, 'Joe', '05/02/13');
INSERT INTO lead VALUES (3, 'Joe', '05/03/13');
INSERT INTO lead VALUES (4, 'Sally', '05/03/13');
INSERT INTO lead VALUES (5, 'Sally', '05/03/13');
INSERT INTO lead VALUES (6, 'Andrew', '05/04/13');

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

| MARKETER | 05/01/13 | 05/02/13 | 05/03/13 | 05/04/13 |
--------------------------------------------------------
|      Joe |        1 |        1 |        1 |        0 |
|    Sally |        0 |        0 |        2 |        1 |
|   Andrew |        0 |        0 |        0 |        1 |

Какой запрос SQL для создания этого?

У меня есть этот пример, настроенный на SQL Fiddle: http://sqlfiddle.com/#!12/eb27a /1


person hekevintran    schedule 16.05.2013    source источник
comment
Вам нужно столько столбцов, сколько разных дат в таблице? разве это не странный вывод для отчета?   -  person jurgenreza    schedule 17.05.2013
comment
Я хочу, чтобы столбцов было столько, сколько дат в месяце. Это для создания еженедельных и ежемесячных отчетов.   -  person hekevintran    schedule 17.05.2013
comment
Я думаю, у вас нет другого пути, кроме как делать то, что ответил ntalbs, вы должны перечислять каждый день.   -  person jurgenreza    schedule 17.05.2013
comment
+1 за включение скрипки.   -  person jurgenreza    schedule 17.05.2013


Ответы (2)


Чистый SQL не может создать такую ​​структуру (она двумерная, но sql возвращает простой список записей).

Вы можете сделать такой запрос:

select marketer, date_set, count(id) 
from lead
group by marketer, date_set;

И визуализируйте эти данные с помощью вашей системы отчетности.

person Parandroid    schedule 16.05.2013
comment
Это необработанные данные, которые мне нужны. У меня есть веб-фреймворк, подключенный к базе данных, который может взять результат этого запроса и сгенерировать нужную мне таблицу. - person hekevintran; 17.05.2013

Вы можете сделать это следующим образом:

select
  marketer,
  count(case when date_set = '05/01/13' then 1 else null end) as "05/01/13",
  count(case when date_set = '05/02/13' then 1 else null end) as "05/02/13",
  count(case when date_set = '05/03/13' then 1 else null end) as "05/03/13",
  count(case when date_set = '05/04/13' then 1 else null end) as "05/04/13"
from lead
group by marketer
person ntalbs    schedule 16.05.2013
comment
+1 Я написал аналогичный запрос, но с 0 вместо нуля, и он не работает. Есть идеи, почему? - person jurgenreza; 17.05.2013
comment
@jurgenreza Когда вы используете 0 вместо нуля, вы должны использовать функцию sum. Функция count считает любые значения, включая нули. - person ntalbs; 17.05.2013
comment
В любом случае, этот запрос не является гибким. Способ @Parandroid обычно лучше, чем этот. - person ntalbs; 17.05.2013