【问题标题】:SQL Running Query SubtractionSQL运行查询减法
【发布时间】:2021-09-29 06:53:11
【问题描述】:

采购订单表

CREATE TABLE [dbo].[PO]
(
    [ID] [int] IDENTITY(1,1) NOT NULL,
    [PONO] [nvarchar](10) NULL,
    [ItemName] [nvarchar](10) NULL,
    [Color] [nvarchar](10) NULL,
    [POQty] [float] NULL,

    CONSTRAINT [PK_TestPO] 
        PRIMARY KEY CLUSTERED ([ID] ASC)
                    WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF,
                          IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]

采购订单插入

 SET IDENTITY_INSERT [dbo].[PO] ON 
    
 INSERT INTO [dbo].[PO] ([ID], [PONO], [ItemName], [Color], [POQty]) 
 VALUES (1, N'K1', N'A1', N'C1', 5240)
 INSERT INTO [dbo].[PO] ([ID], [PONO], [ItemName], [Color], [POQty]) 
 VALUES (2, N'K2', N'A1', N'C1', 393)
 INSERT INTO [dbo].[PO] ([ID], [PONO], [ItemName], [Color], [POQty]) 
 VALUES (3, N'K3', N'A1', N'C1', 4847)
 INSERT INTO [dbo].[PO] ([ID], [PONO], [ItemName], [Color], [POQty]) 
 VALUES (4, N'K4', N'A3', N'C3', 2968)
 INSERT INTO [dbo].[PO] ([ID], [PONO], [ItemName], [Color], [POQty]) 
 VALUES (5, N'K5', N'A4', N'C4', 3224)

 SET IDENTITY_INSERT [dbo].[PO] OFF

直流表

CREATE TABLE [dbo].[DC]
(
     [ID] [int] IDENTITY(1,1) NOT NULL,
     [ItemName] [nvarchar](10) NULL,
     [Color] [nvarchar](10) NULL,
     [DCQty] [float] NULL,

     CONSTRAINT [PK_DCQty] 
         PRIMARY KEY CLUSTERED ([ID] ASC)
                     WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, 
                           IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
 ) ON [PRIMARY]

直流插入

 SET IDENTITY_INSERT [dbo].[DC] ON 
    
 INSERT INTO [dbo].[DC] ([ID], [ItemName], [Color], [DCQty]) 
 VALUES (1, N'A1', N'C1', 9500)

 SET IDENTITY_INSERT [dbo].[DC] OFF

此查询已尝试

;WITH cte AS
(
    SELECT
        A.PONO, A.ItemName, A.Color, A.POQty,                
        CASE 
            WHEN RN = 1 
                THEN CASE WHEN POQty > B.DCQty 
                              THEN B.DCQty 
                              ELSE POQty 
                     END 
            ELSE 0 
        END DCQty,
        CASE WHEN RN = 1 THEN b.DCQty ELSE 0 END DCQty1
    FROM 
        (SELECT
             ROW_NUMBER() OVER ( PARTITION BY ItemName, Color ORDER BY PONO) RN,
             PONO, ItemName, Color, POQty
         FROM 
             [PO]) A 
    LEFT JOIN 
        [DC] B ON A.ItemName = B.ItemName AND A.Color = B.Color
    WHERE
        A.ItemName = 'A1' AND A.Color = 'C1' 
), 
cte1 AS
(
    SELECT
        PONO, ItemName, Color, POQty, 
        ISNULL(LAG (DCQty1 - DCQty) OVER (PARTITION BY ItemName, Color ORDER BY PONO), DCQty) DCQty
    FROM
        cte
)    
SELECT *
FROM 
    (SELECT
         PONO, ItemName, Color, POQty, DCQty, 
         POQty - DCQty POBalQty 
     FROM 
         cte1) a

输出是

PONO    ItemName    Color    POQty    DCQty    POBalQty
-------------------------------------------------------
K1         A1       C1       5240      5240    0
K2         A1       C1        393      4260    -3867

在 K2 PONO PO Qty 小于 DCQty 那么它应该检查下一个 PO 对吗?

这里有什么问题?

希望所有内容都已详细解释,以便更好地理解。

我需要根据 DCQty 隔离 POQty。这里 PO 和 DC 表有一个共同的字段名称,即 ItemName 和 Color 基于此列我正在将 PO 表与 DC 表匹配。

用户将传递批量 DCQty。基于 ItemName 和 Color 查询应检查 PONO 和 POQty 并将其与 DCQty 匹配。

每个 PO NO 的条件是 DC Qty 应该小于 PO Qty 如果 DC Qty 大于 PO Qty 然后查询应该检查下一个 PO NO 和 PO Qty

这是预期的输出



尝试使用临时表

   CREATE TABLE #test(ID INT,DCQty INT);     
   DECLARE @i INT
   SET @i=1
   WHILE @i<=(SELECT MAX(ID) FROM [PO]) AND 
   (SELECT SUM(POQty) FROM [PO] WHERE ID<=
   CASE WHEN @i=1 THEN 1 ELSE @i-1 END)<=(SELECT DCQty FROM [DC])
   BEGIN 
        
    INSERT INTO #test VALUES(@i,
    CASE WHEN @i=1 THEN (SELECT POQty FROM [PO] WHERE ID=@i)
    WHEN @i>1 AND
    (SELECT POQty FROM [PO] WHERE ID=@i)
   <(SELECT DCQty FROM [DC])-(SELECT SUM(POQty) 
    FROM [PO] WHERE ID<=@i-1)
    THEN (SELECT POQty FROM [PO] WHERE ID=@i)
    WHEN @i>1 AND (SELECT POQty FROM [PO] WHERE ID=@i)
   >(SELECT DCQty FROM [DC])-(SELECT SUM(POQty) FROM [PO] WHERE ID<=@i-1)
   THEN (SELECT DCQty FROM [DC])-(SELECT SUM(POQty) FROM [PO] WHERE ID<=@i-1)
   END)
         
   SET @i=@i+1
  END;
        
  SELECT p.*,t.DCQty,POBa=p.POQty-t.DCQty FROM  [PO] p
  JOIN #test t
  ON p.ID=t.ID

这是查询输出上方的临时表

以上查询有 2 个问题

第一 如果 DC 数量小于 PO 数量,则它不会返回任何结果集,我的意思是结果集为空。 例如:K1 PO Qty 为 5240,DC Qty 为 5000 则结果为空。

第二 如果 DC Qty 是 5633 这实际上是 PONO K1、K2 的总数量,即 K1、K2 PO 数量的 5633。 然后 K2 DC Qty 返回为 NULL。

这是预期的输出

【问题讨论】:

  • 预期输出会有所帮助
  • 上述查询的任何更新...

标签: sql sql-server common-table-expression


【解决方案1】:

一个简单的运行总和看起来应该适合你

SELECT
    t.PONO,
    t.ItemName,
    t.Color,
    t.POQty,
    t.DCQty,
    POBalQty = CASE WHEN t.RunningSum - t.DCQty > 0 THEN t.RunningSum - t.DCQty ELSE 0 END
FROM (
    SELECT
        PO.PONO,
        PO.ItemName,
        PO.Color,
        PO.POQty,
        DC.DCQty,
        RunningSum = SUM(PO.POQty) OVER (PARTITION BY PO.ItemName, PO.Color
            ORDER BY PO.ID DESC ROWS UNBOUNDED PRECEDING)
    FROM DC
    JOIN PO ON DC.ItemName = PO.ItemName
         AND DC.Color = PO.Color
) t
WHERE t.RunningSum - t.DCQty - t.POQty < 0;

db<>fiddle

【讨论】:

  • 在上面的查询中……对于所有的PO NO,DC Qty都取为9500。
猜你喜欢
  • 2014-07-04
  • 1970-01-01
  • 2016-03-13
  • 1970-01-01
  • 2023-03-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-03-16
相关资源
最近更新 更多