Как получить ежедневные открытые запасы с динамической датой окончания без сохранения результатов в сводной таблице? - PullRequest
2 голосов
/ 13 мая 2019

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

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

DECLARE @D AS DATE = '04/01/2019'
WHILE @D <= CAST(GETDATE() AS DATE)
BEGIN
INSERT INTO DBO.OPEN_INVENTORY
SELECT
@D OPEN_DATE
,COUNT(1) OPEN_VOLUME
FROM
DBO.INVENTORY_RECORDS
WHERE
@D BETWEEN START_DATE AND ISNULL(END_DATE,'12/31/2199')
SET @D = DATEADD(D,+1,@D)
END

Я хотел бы воспроизвести эти результаты без необходимости сохранения томов в сводной таблице.Есть ли способ сделать это за один выбор?

1 Ответ

0 голосов
/ 13 мая 2019

Да, лучшим способом было бы использовать то, что известно как «Таблица подсчета».Они очень быстро строят большие наборы последовательных данных и, в отличие от WHILE, CURSOR или rCTE, не являются рекурсивными.

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

DECLARE @D AS DATE = '20190104';

WITH N AS(
    SELECT N
    FROM (VALUES(NULL),(NULL),(NULL),(NULL),(NULL),(NULL),(NULL),(NULL),(NULL),(NULL)) N(N)),
Tally AS(
    SELECT ROW_NUMBER() OVER (ORDER BY (SELECT NULL)) -1 AS I
    FROM N N1, N N2, N N3), --1000 rows should be enough?
Dates AS(
    SELECT DATEADD(DAY, T.I, @D) AS CalendarDate
    FROM Tally T
    WHERE DATEADD(DAY, T.I, @D) <= GETDATE())
SELECT D.CalendarDate,
       COUNT(IR.YourIDColumn) AS OPEN_VOLUMNE
FROM Dates D
     LEFT JOIN DBO.INVENTORY_RECORDS IR ON D.Date >= IR.START_DATE
                                       AND (D.Date <= IR.END_DATE OR IR.END_DATE IS NULL)
GROUP BY D.CalendarDate;

Если нет, попробуйте устранить неполадки самостоятельно, а затем предоставьте образец и ожидаемые результаты, если нет.

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