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

问题描述

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

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,@Date) + 1,0) 
        END AS myDate,SKU 
    FROM
        BS_BufferSetting
    UNION ALL
    SELECT 
        DATEADD(day,1,myDate),SKU
    FROM 
        cte
    WHERE 
        DATEADD(day,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

上述查询返回的结果集如下:

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

一旦我将其链接到主查询,我将需要弄清楚如何添加期初股票(来自主表)并制定一个运行总数,但这是问题的第二部分。

解决方法

您可以像这样链接 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,@Date) + 1,0) 
        END AS myDate,SKU 
    FROM
        BS_BufferSetting
    UNION ALL
    SELECT 
        DATEADD(day,1,myDate),SKU
    FROM 
        cte
    WHERE 
        DATEADD(day,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