【发布时间】: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