如何将从 with 语句派生的 table 连接到更大的查询中

How to join a table which is derived from a with statement into a larger query

我有一个大型查询,它连接了许多不同的 select 查询以创建单个 table,其中一列记录当前库存。我现在需要计算接下来 99 天内的缺货天数,但由于进货库存和需求库存没有每天的记录,我必须创建一个 table 来显示每天的库存变动接下来的 99 天,通过获取当前库存加上每个未来日期的库存变化。为了做到这一点,我创建了下面的独立查询,其中 returns 每天库存变化的正确结果,我现在面临的问题是我无法将此查询加入主查询。

DECLARE @Date date

SET @Date = '2020-12-15'

;WITH cte AS 
(
    SELECT 
        CASE 
           WHEN DATEPART(Day, @Date) = 1 THEN @Date 
           ELSE DATEADD(day, DATEDIFF(day, 0, @Date) + 1, 0) 
        END AS myDate,
        SKU 
    FROM
        BS_BufferSetting
    UNION ALL
    SELECT 
        DATEADD(day, 1, myDate), SKU
    FROM 
        cte
    WHERE 
        DATEADD(day, 1, myDate) <= DATEADD(day, 99, @Date)
)
SELECT 
    myDate AS Date,
    SKU, 
    ISNULL(Amount_IOP, 0) - ISNULL(Amount_DP, 0) AS Amount
FROM
    CTE 
LEFT OUTER JOIN 
    DP_Demand ON SKU = SKU_DP AND mydate = Date_DP 
LEFT OUTER JOIN 
    IOP_Inbound ON SKU = SKU_IOP AND mydate = Date_IOP

上面的查询returns结果集是这样的:

Date        SKU Amount
----------------------
2020-12-16  BEX -108
2020-12-17  BEX  0
2020-12-18  BEX -12
2020-12-19  BEX  0
 

将其链接到主查询后,我将需要计算如何添加期初库存(来自主 table)并制定 运行 总数,但这是问题的第二部分。

您可以像这样链接 CTE:

;with firstcte as 
(
select 1 as MyColumn
),
AnotherCTEUsingTheFirstOne as 
(
    select MyColumn from firstcte
)
select * from AnotherCTEUsingTheFirstOne

所以你应该可以;

DECLARE @Date date

SET @Date = '2020-12-15'

;WITH cte AS 
(
    SELECT 
        CASE 
           WHEN DATEPART(Day, @Date) = 1 THEN @Date 
           ELSE DATEADD(day, DATEDIFF(day, 0, @Date) + 1, 0) 
        END AS myDate,
        SKU 
    FROM
        BS_BufferSetting
    UNION ALL
    SELECT 
        DATEADD(day, 1, myDate), SKU
    FROM 
        cte
    WHERE 
        DATEADD(day, 1, myDate) <= DATEADD(day, 99, @Date)
),
secondCTE As
(
SELECT 
    myDate AS Date,
    SKU, 
    ISNULL(Amount_IOP, 0) - ISNULL(Amount_DP, 0) AS Amount
FROM
    CTE 
LEFT OUTER JOIN 
    DP_Demand ON SKU = SKU_DP AND mydate = Date_DP 
LEFT OUTER JOIN 
    IOP_Inbound ON SKU = SKU_IOP AND mydate = Date_IOP
)


SELECT * FROM ATable A INNER JOIN secondCTE B ON A.Col=B.Col