SQL группируется по дате, но также получает даты без записей - PullRequest
2 голосов
/ 30 декабря 2008

Есть ли простой способ сделать GROUP BY DATE(timestamp), который включает в себя все дни периода, независимо от того, есть ли какие-либо записи, связанные с этой датой?

По сути, мне нужно создать такой отчет:

24 Dec - 0 orders
23 Dec - 10 orders
22 Dec - 8 orders
21 Dec - 2 orders
20 Dec - 0 orders

Ответы [ 6 ]

5 голосов
/ 30 декабря 2008

Если у вас больше заказов, чем дат, может сработать что-то вроде этого:

select date, count(id) as orders
from
(
  SELECT DATE_ADD('2008-01-01', INTERVAL @rn:=@rn+1 DAY) as date from (select @rn:=-1)t, `order` limit 365
) d left outer join `order` using (date)
group by date
3 голосов
/ 30 декабря 2008

Один из способов - создать таблицу календаря и присоединиться к ней.

Я бы создал его навсегда, а затем создал бы задачу, которая будет вставлять новые даты, это может быть сделано еженедельно, ежедневно, ежемесячно и т. Д.

Обратите внимание, что я предполагаю, что вы конвертируете свою метку времени в дату.

2 голосов
/ 30 декабря 2008

Вместо использования GROUP BY создайте таблицу (возможно, временную таблицу), которая содержит конкретные даты, которые вы хотите, например:

24 Dec
23 Dec
22 Dec
21 Dec
20 Dec

Затем присоедините эту таблицу к таблице заказов.

0 голосов
/ 11 октября 2014

Есть довольно простой способ сделать это ... кроме того, что я не могу вспомнить это. Но я адаптировал этот запрос из этой темы :

SELECT 
    DISTINCT(LEFT(date_field,11)) AS `Date`,
    COUNT(LEFT(date_field,11)) AS `Number of events`
FROM events_table
GROUP BY `Date`

Это работает и в MySQL

0 голосов
/ 30 декабря 2008

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

Если вы используете слой отчетов поверх SQL Server, вы можете просто написать некоторую логику, чтобы вставить пропущенные даты в интересующий вас диапазон после возврата данных и перед обработкой отчета.

Если вы создаете свои отчеты непосредственно из SQL Server, и у вас еще нет хранилища данных, и у вас нет времени или необходимости создавать его прямо сейчас, я бы создал таблицу дат и присоединился бы к ней. Форматирование, необходимое для объединения и получения нужного результата, может быть немного сложным, но оно выполнит свою работу.

0 голосов
/ 30 декабря 2008

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

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

Просто присоединитесь к реальным данным из временной таблицы, используя внешнее объединение

В SQL Server это было бы так

  Declare @Dates Table (aDate DateTime Not Null)
  Declare @StartDt DateTime Set @StartDt = 'Dec 1 2008'
  Declare @EndDt   DateTime Set @EndDt   = 'Dec 31 2008'
  While @StartDt < @EndDt Begin
    Insert @Dates(aDate) Values(@StartDt)
    Set @StartDt = DateAdd(Day, 1, @StartDt)
  End

   Select D.aDate, Count(O.*) Orders
   From @Dates D Left Join 
      OrderTable O On O.OrderDate = D.aDate
   Group By D.aDate
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...