@maks78945

Как объединить две таблицы по дате?

Здравствуйте, есть 2 таблицы
time_dimension
id
db_date

client
id
date_create
delete
name
......

Я хочу получить количество записей из таблица clients за каждый день, их может быть как и несколько, так и 0. В таблице time_dimension хранятся все даты за 10 лет.

У меня получилось получить этот список вот таким запросом:
SELECT 
	time_dimension.db_date, COUNT(clients.date_create)
FROM
	time_dimension
LEFT JOIN 
	clients
ON
	time_dimension.db_date = DATE_FORMAT(clients.date_create,"%Y-%m-%d")
WHERE 
	time_dimension.db_date BETWEEN '2019-12-01' AND '2019-12-30'
GROUP BY
	time_dimension.db_date
ORDER BY
	time_dimension.db_date


но если я в while Добавляю clients.`delete`='0' я получаю записи только за дни когда были новые клиенты, а необходимо все дни за период
  • Вопрос задан
  • 456 просмотров
Пригласить эксперта
Ответы на вопрос 3
@d-stream
Готовые решения - не подаю, но...
Прямой вариант - full join
Только надо ли именно получить полотно из ~3650 строк, где кое-где будут изредка мелькать количества, отличные от нуля?

p.s. судя по структуре time_dimension - ее примерно под это и делали

p.p.s. очень подозреваю что все это потом должно попасть в некие графики динамики клиентской базы, то лучше скармливать туда сырые данные
Ответ написан
tsklab
@tsklab
Здесь отвечаю на вопросы.
Если d-stream прав и вам нужен календарный отчёт, например:
5ccfebe00a885762447066.png
То предлагается следующий вариант его построения: q628559.
Ответ написан
Комментировать
@kodv
Я так понимаю, когда вы писали while. вы имели ввиду WHERE. Тогда вам нужно перенести условие clients.`delete`='0' из секции WHERE в секцию ON.
SELECT 
  time_dimension.db_date, COUNT(clients.date_create)
FROM
  time_dimension
LEFT JOIN 
  clients
ON
  time_dimension.db_date = DATE_FORMAT(clients.date_create,"%Y-%m-%d")
  AND clients.`delete`='0'
WHERE 
  time_dimension.db_date BETWEEN '2019-12-01' AND '2019-12-30'
GROUP BY
  time_dimension.db_date
ORDER BY
  time_dimension.db_date
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы