Comment utiliser while while dans Outer Apply – SQL Server

Ce que je dois faire:

  • Identifier les travaux ouverts pour chaque pièce à partir de la command client en fonction de la date d'échéance la plus proche
  • Condition: Indiquez le travail / les travaux les plus anciens (pour une partie spécifique) qui satisfont la request de command client. Si le travail supérieur ne correspond pas à la quantité requirejse, select le travail suivant.

Table de command client – Nom: SalesOrder

SO | Part | SO_Qty | -------------------------- SO1 | Part1 | 5 | SO2 | Part2 | 7 | SO3 | Part3 | 4 | 

Job Order Table – Nom: JobOrder – ((Tous les jobs ouverts – sortingés sur Due_Date)

 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 | 

Tableau des résultats (C'est ce que j'aimerais voir ..)

 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 | 

Ce que j'ai essayé:

  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 

Cela renvoie toutes les commands de travail correspondantes, quelle que soit la quantité de la command. Ce n'est PAS ce que je cherche ..

Ma question : puis-je utiliser while loop dans la sous-requête pour filterr les loggings?

Merci d'avance pour toute votre aide ..

Script avec lequel vous pouvez travailler:

 ;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) ) 

Je pense que vous pouvez le résoudre en utilisant un CTE récursif – c'est un peu long, mais c'est mon meilleur effort …

 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;