SQL-еженедельный отчет семь дней (с воскресенья по субботу) - PullRequest
3 голосов
/ 11 июля 2019

Я создал следующий запрос, чтобы повторяться каждые семь дней, включая субботу и воскресенье. Этот отчет будет запускаться каждые семь дней. Однако проблема, с которой я сталкиваюсь в те дни, когда в нашем отчете папки SFTP (входящие) были получены файлы, должна иметь запись для отсутствующего значения Null = 0. Основная цель - сделать этот автоматизированный процесс, который будет выполняться каждое воскресенье до конца дня. Воскресенье каждые семь дней Пример:

SELECT SubmitterID,SubmitterName,convert(varchar(15), DateReceived, 101) DateReceived,sum(ClaimCount) as TotalCount
FROM FalloutClaimReport
WHERE DateReceived BETWEEN '2019-06-01' AND '2019-06-07'
--ORDER BY COUNT(submitterID) DESC;
GROUP BY submitterid, SubmitterName, convert(varchar(15), DateReceived, 101)

DECLARE @StartDate AS DATETIME
DECLARE @EndDate AS DATETIME
DECLARE @CurrentDate AS DATETIME

SET @StartDate = '2019-06-01' --AND '2019-06-10'
SET @StartDate = '2019-06-07'
SET @EndDate = GETDATE()
SET @CurrentDate = @StartDate

Ответы [ 2 ]

2 голосов
/ 11 июля 2019

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

Расчет даты

Давайте начнемс некоторыми запросами (и они предполагают установку в США, поскольку днем ​​по умолчанию является понедельник.

SELECT
    DATEADD(WEEK, -1, CAST(DATEADD(WEEK, DATEDIFF(WEEK, 0, CAST(GETDATE() AS date)), -1) AS date)) AS TheLastSundayOfTheFullWeek
,   DATEADD(WEEK, -1, CAST(DATEADD(WEEK, DATEDIFF(WEEK, 0, CAST(GETDATE() AS date)), +5) AS date)) AS TheLastSaturdayOfTheFullWeek
,   CAST(DATEADD(WEEK, DATEDIFF(WEEK, 0, CAST(GETDATE() AS date)), -1) AS date) AS SundayOfTheCurrentWeek
,   CAST(DATEADD(WEEK, DATEDIFF(WEEK, 0, CAST(GETDATE() AS date)), +5) AS date) AS SaturdayOfTheCurrentWeek;

Эти запросы генерируют следующие даты

TheLastSundayOfTheFullWeek TheLastSaturdayOfTheFullWeek SundayOfTheCurrentWeek SaturdayOfTheCurrentWeek
2019-06-30                 2019-07-06                   2019-07-07             2019-07-13

Calendar June/July 2019

Последняя полная неделя будет проходить с 6/30 по 7/06. Текущая неделя будет определяться как с 7/7 по 7/13.

В зависимости от того, какое определение недели вам нужно, выберитесоответствующая пара столбцов.

Работа с неизвестными

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

SELECT
    FCR.SubmitterID
,   FCR.SubmitterName
,   CONVERT(varchar(15), ED.DateReceived, 101) AS DateReceived
,   SUM(FCR.ClaimCount) AS TotalCount
FROM
    (
        -- This logic builds out a list of all the dates that must exist on the report
        -- I used the logic for TheLastSundayOfTheFullWeek
        SELECT
            DATEADD(DAY, D.DayOffset, DATEADD(WEEK, -1, CAST(DATEADD(WEEK, DATEDIFF(WEEK, 0, CAST(GETDATE() AS date)), -1) AS date))) AS DateReceived
        FROM
        (
            -- Generate a series of 7 numbers from 0 t 6
            SELECT TOP 7
                -1 + ROW_NUMBER() OVER (ORDER BY (SELECT NULL)) AS rn
            FROM
                sys.all_columns AS AC 
        ) D(DayOffset)
    ) AS ED
    LEFT OUTER JOIN
        dbo.FalloutClaimReport AS FCR
        ON FCR.DateReceived = ED.DateReceived
GROUP BY
    CONVERT(varchar(15), ED.DateReceived, 101)
,   FCR.SubmitterID
,   FCR.SubmitterName;

, который генерирует набор результатовкак

enter image description here

Мы дУ нас нет данных 30-го или 5-го числа, но в запросе все еще есть записи.Если вам нужны значения по умолчанию, оберните столбец вызовами ISNULL / COALESCE.

DBFiddle версия , чтобы предоставить тестовую изолированную программную среду

0 голосов
/ 11 июля 2019

Одри,

Я бы предложил два возможных решения. Предполагая, что вы имели в виду SRS, SSRS ....

1) Я бы настроил ваше задание SSIS на запуск через агент SQL каждые 7 дней. Он вызвал бы хранимую процедуру (SP), которая затем выполнялась и записывалась в таблицу ... при вызове этого SP она запускалась:

SELECT 
SubmitterID,
SubmitterName,
convert(varchar(15), DateReceived, 101) DateReceived,
sum(ClaimCount) as TotalCount
FROM FalloutClaimReport
WHERE cast(DateReceived as date) BETWEEN dateadd(d,-7,cast(getdate() as date)) AND dateadd(d,-1,cast(getdate() as date))

GROUP BY 
submitterid,
SubmitterName,
convert(varchar(15), DateReceived, 101)

2) Если вы решите пойти по пути SSRS, вы должны сделать подписку на отчет, которая автоматически рассылает нужным вам пользователям, которая вызывает хранимую процедуру, описанную выше, и отправляет то, что вам нужно, тому, кто в ней нуждается. (Приведенного выше кода должно хватить, если он выбирает то, что вам нужно)

...