SQL-запрос с днями недели - PullRequest
2 голосов
/ 11 августа 2010

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

08/01/10 | 0 08.02.10 | 5 08.03.10 | 6 08.04.10 | 10 08.05.10 | 0 08.06.10 | 11 08/07/10 | 1

единственный вариант - создать фиктивную таблицу с этими днями и присоединиться к ним вообще?

спасибо

Ответы [ 4 ]

3 голосов
/ 11 августа 2010

Многие люди предложат методы для динамического создания диапазона дат, к которым вы затем можете присоединиться.Это, безусловно, сработает, но, по моему опыту, лучше всего использовать таблицу календаря.Это сделает SQL тривиальным и универсальным за счет поддержки таблицы календаря.

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

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

3 голосов
/ 11 августа 2010

Попробуйте что-то вроде этого

WITH LastDays (calc_date)
AS
(SELECT DATEADD(DAY, DATEDIFF(DAY, 0, CURRENT_TIMESTAMP) - 6, 0)
UNION ALL
SELECT DATEADD(DAY, 1, calc_date)
FROM LastDays
WHERE DATEADD(DAY, 1, calc_date) < CURRENT_TIMESTAMP)
SELECT ...
FROM LastDays l LEFT JOIN (YourQuery) t ON (l.cal_date = t.YourDateColumn);
0 голосов
/ 11 августа 2010

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

0 голосов
/ 11 августа 2010

Вы не упоминаете конкретный язык (просьба дать более подробный ответ), но большинство версий sql имеют функцию для текущей даты (например, GetDate ()). Вы можете взять эту дату, вычесть x (7) дней и построить свое утверждение WHERE следующим образом.

Тогда вы могли бы GROUP BY на дневную часть этой даты.

...