SQL GROUP BY со "значениями по умолчанию" - PullRequest
5 голосов
/ 10 мая 2010

Я пытаюсь создать оператор SELECT с предложением GROUP BY, который должен возвращать "значения по умолчанию".

Представьте себе следующую простую таблицу MySQL:

CREATE TABLE `tracker` (
  `id` INTEGER PRIMARY KEY auto_increment,
  `date` DATETIME NOT NULL,
  `customer_id` INTEGER NOT NULL
);

Таблица содержит только одну запись:

INSERT INTO `tracker` (`date`, `customer_id`) VALUES('2010-05-03', 1);

После подопечных я выполняю следующий SQL-запрос:

SELECT DATE(`date`), COUNT(customer_id) FROM tracker
WHERE DATE(`date`) >= '2010-05-01' AND DATE(`date`) <= '2010-05-05'
GROUP BY DATE(`date`) ORDER BY DATE(`date`);

И получите ожидаемый набор результатов:

+----+---------------------+-------------+
| id | date                | customer_id |
+----+---------------------+-------------+
|  1 | 2010-05-10 00:00:00 |           1 |
+----+---------------------+-------------+

Однако мне бы хотелось, чтобы набор результатов выглядел так:

+--------------+--------------------+
| DATE(`date`) | COUNT(customer_id) |
+--------------+--------------------+
| 2010-05-01   |                  0 |
| 2010-05-02   |                  0 |
| 2010-05-03   |                  1 |
| 2010-05-04   |                  0 |
| 2010-05-05   |                  0 |
+--------------+--------------------+

Можно ли добиться такого поведения?

Ответы [ 2 ]

3 голосов
/ 10 мая 2010

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

Martin

1 голос
/ 10 мая 2010

Как сказал Мартин, лучшее решение - создать временную таблицу с датами.

Тогда есть 2 подхода:

  • Выполните внешнее соединение с этой временной таблицей и выполните group by результат, ИЛИ

  • group by на исходной таблице + UNION select date,0 as count from date_table d where not exists (select 1 from customer c where c.date=d.date)

...