Sql server 如何在外部Apply-sqlserver中使用while循环
我需要做的是: 根据最早的到期日确定销售订单中每个零件的未结作业 条件:列出满足销售订单需求的特定零件的最早工单。如果顶部工单不满足所需数量,则选择下一个工单。。 销售订单表–名称:SalesOrder 作业订单表-名称:作业订单-所有打开的作业-在到期日排序Sql server 如何在外部Apply-sqlserver中使用while循环,sql-server,sql-server-2008,tsql,Sql Server,Sql Server 2008,Tsql,我需要做的是: 根据最早的到期日确定销售订单中每个零件的未结作业 条件:列出满足销售订单需求的特定零件的最早工单。如果顶部工单不满足所需数量,则选择下一个工单。。 销售订单表–名称:SalesOrder 作业订单表-名称:作业订单-所有打开的作业-在到期日排序 SO | Part | JO | JO_Qty | Due_Date | ----------------------------------------- SO1 | Part1 | JO1a | 6 | 11/01/
SO | Part | JO | JO_Qty | Due_Date |
-----------------------------------------
SO1 | Part1 | JO1a | 6 | 11/01/16 |
SO1 | Part1 | JO1b | 5 | 11/10/16 |
SO2 | Part2 | JO2a | 3 | 11/01/16 |
SO2 | Part2 | JO2b | 2 | 11/08/16 |
SO2 | Part2 | JO2c | 9 | 11/18/16 |
SO3 | Part3 | JO3a | 4 | 12/05/16 |
SO3 | Part3 | JO3b | 2 | 12/20/16 |
结果表这是我想看到的
SO | Part | SO_Qty | JO | JO_Qty | Due_Date |
-------------------------------------------------
SO1 | Part1 | 5 | JO1a | 6 | 11/01/16 |
SO2 | Part2 | 7 | JO2a | 3 | 11/01/16 |
SO2 | Part2 | 7 | JO2b | 2 | 11/08/16 |
SO2 | Part2 | 7 | JO2c | 9 | 11/18/16 |
SO3 | Part3 | 4 | JO3a | 4 | 12/05/16 |
我所尝试的:
Select OD.*, SQ.jo, SQ.jo_qty, SQ.due_date
From SalesOrder AS OD
OUTER APPLY (Select jo, jo_qty, due_date
From JobOrder as JO
Where JO.so = OD.so AND JO.part = OD.part) AS SQ
这将返回所有匹配的工单,而不考虑工单数量。那不是我要找的
我的问题:我可以在子查询中使用while循环来过滤记录吗
提前感谢你的帮助
您可以使用的脚本:
我想你可以用递归CTE来解决这个问题——这有点冗长,但这是我最大的努力
WITH j AS
(
SELECT
jo.SO
,so.Part
,so.SO_Qty
,jo.JO
,jo.JO_Qty
,jo.Due_Date
,ROW_NUMBER() OVER(ORDER BY jo.SO, Due_Date) AS RowID
FROM #jobOrder jo
JOIN #SalesOrder so
ON jo.SO = so.SO
AND jo.Part = so.Part
)
,rCTE AS
(
SELECT
RowID
,SO
,Part
,SO_Qty
,JO
,JO_Qty
,Due_Date
,JO_Qty - SO_Qty AS Diff
FROM j
WHERE RowID = 1
UNION ALL
SELECT
j.RowID
,r.SO
,j.Part
,j.SO_Qty
,j.JO
,j.JO_Qty
,j.Due_Date
,CASE WHEN j.Part != r.Part OR (j.Part = r.Part AND Diff < 0) THEN
j.JO_Qty - j.SO_Qty
END
FROM rCTE r
JOIN j
ON j.RowID = r.RowID + 1
)
SELECT
*
FROM rCTE
WHERE Diff IS NOT NULL;
结果表中的SO2 | Part2 | 7 | JO2c | 9 | 11/18/16 |输出有效吗?是的。第2部分的需求,因此数量=7。前2个作业的总数量=5。需要选择下一份工作来满足需求。谢谢使用SQL Server 2012及更高版本很容易。对于2008,我建议将光标放在自连接上。非常感谢。。我会尝试一下并告诉你最新情况。@Hycinth,这有帮助吗?HotblackDesiatoHotblackDesiato,还没有。我还在努力。你的解决方案很棒,但它会在相同的条件下返回结果。SO1。不区分销售订单。此外,我对这个CTE还是有点不了解,我试图理解逻辑,而不只是抓住代码。谢谢你没有忘记我。。
;WITH SalesOrder AS (
SELECT *
FROM (VALUES
('SO1', 'Part1', 5),
('SO2', 'Part2', 7),
('SO3', 'Part3', 4)
) as t(SO, Part, SO_Qty)
), JobOrder AS (
SELECT *
FROM (VALUES
('SO1', 'Part1', 'JO1a', 6 , '11/01/16'),
('SO1', 'Part1', 'JO1b', 5 , '11/10/16'),
('SO2', 'Part2', 'JO2a', 3 , '11/01/16'),
('SO2', 'Part2', 'JO2b', 2 , '11/08/16'),
('SO2', 'Part2', 'JO2c', 9 , '11/18/16'),
('SO3', 'Part3', 'JO3a', 4 , '12/05/16'),
('SO3', 'Part3', 'JO3b', 2 , '12/20/16')
) as t(SO, Part, JO, JO_Qty, Due_Date)
)
WITH j AS
(
SELECT
jo.SO
,so.Part
,so.SO_Qty
,jo.JO
,jo.JO_Qty
,jo.Due_Date
,ROW_NUMBER() OVER(ORDER BY jo.SO, Due_Date) AS RowID
FROM #jobOrder jo
JOIN #SalesOrder so
ON jo.SO = so.SO
AND jo.Part = so.Part
)
,rCTE AS
(
SELECT
RowID
,SO
,Part
,SO_Qty
,JO
,JO_Qty
,Due_Date
,JO_Qty - SO_Qty AS Diff
FROM j
WHERE RowID = 1
UNION ALL
SELECT
j.RowID
,r.SO
,j.Part
,j.SO_Qty
,j.JO
,j.JO_Qty
,j.Due_Date
,CASE WHEN j.Part != r.Part OR (j.Part = r.Part AND Diff < 0) THEN
j.JO_Qty - j.SO_Qty
END
FROM rCTE r
JOIN j
ON j.RowID = r.RowID + 1
)
SELECT
*
FROM rCTE
WHERE Diff IS NOT NULL;