首页 > 解决方案 > 为日历的所有日期拉伸余额表

问题描述

我有一个库存余额表,截至更改 SQLFiddle的日期

我需要将这些遗骸延伸到缺失的日期,包括 0 个剩菜

我创建了一个日历

CREATE TABLE Calendar
("Date" DATE)
GO

DECLARE @start datetime
DECLARE @end datetime

SET @start = (SELECT MIN (a.Date) FROM Remains a)
SET @end = GETDATE();

WITH cte AS
(
SELECT @start "Date"
UNION all
SELECT "Date" + 1
FROM cte
WHERE "Date" < @end
)
INSERT INTO Calendar
SELECT cast("Date" AS date) AS "Date"
FROM cte
WHERE "Date" < GETDATE()

option(MAXRECURSION 0)

我从 Remains 表中获取最小日期并将其拖到今天 Calendar

接下来,我使用 OUTER APPLY 将日历加入到 Remains 表中,

SELECT 
      b.Date
     ,x.W_Code 
     ,x.Prod_Code
     ,x.Quality
     ,x.Count
FROM Calendar b
OUTER APPLY (
SELECT
      a.Date
     ,a.W_Code
     ,a.Prod_Code
     ,a.Quality
     ,a.Count 
FROM Remains a
WHERE a.Date = b.Date AND a.Prod_Code = N'00005026957' AND a.W_Code = N'000000017' ) x

如果我的查询适用于 1 个特定的仓库、产品和质量,那么我会得到想要的结果

结果

但是如果我删除仓库和产品的条件,则表格构建不正确

我需要每个组 W_Code、Prod_Code、Quality 都有日历中的每个日期

请帮我找到一种方法来实现这个也许我不需要日历我读过关于递归 CTE 但不明白如何应用它

我知道如何用值进一步填充表格,问题在于表格与日期的正确连接

谢谢

标签: sqlsql-server-2019

解决方案


推荐阅读