2016-08-25 64 views
2

我想要通過銷售訂單表來運行數據庫,並獲取零件的開放需求,並按截止日期對其進行排序,然後查看採購訂單表並通過採購訂單完成銷售訂單,並根據到期日訂購採購訂單供應。同時,我需要顯示PO完成銷售訂單的情況。如何在SQL Server 2008查詢中顯示訂單履行

例如:

SO

SO#  DueDate  Part Number Required QTY 
--------------------------------------------- 
100  9/3/16  1012   2 
101  9/12/16  1012   1 
107  10/11/16 1012   4 
103  10/17/16 1012   7 

PO表:

PO#  DueDate  Part Number Ordered QTY 
-------------------------------------------- 
331  9/1/16  1012   1 
362  9/2/16  1012   1 
359  9/24/16  1012   5 
371  10/1/16  1012   3 
380  10/10/16 1012   10 

有了這個數據,我想看到這種結果:

SO# DueDate  Part Number Required QTY PO number QTY Used QTY Remain 
-------------------------------------------------------------------------- 
100 9/3/16  1012   2    331   1   0 
100 9/3/16  1012   1    362   1   0 
101 9/12/16  1012   1    359   1   4 
107 10/11/16 1012   4    359   4   0 
103 10/17/16 1012   7    371   3   0 
103 10/17/16 1012   7    380   4   6 

我之前已經完成了這個銷售訂單履行流程,但並沒有打破訂單履行的要點,而僅僅是總結所有未清供應,然後通過並減去每個銷售訂單的供應量以獲得剩餘供應的運行平衡。

非常感謝您的幫助。

+0

用於輸出表的邏輯,尤其是'數量Remain'不明確。 – Ash

+0

如果你想要一個答案,我建議你使用SQLFiddle.com來設置一個我們可以玩的例子。我將使用的方法是編寫一個查詢,將隊列中的下一個「剩餘」採購訂單應用到隊列中的下一個剩餘銷售訂單,然後重新運行該查詢,直到您用完SO或PO。你需要一個工作表,可以對兩個表進行快照並記錄工作量,以及另一個表格來記錄最終金額。 –

+0

@AshwinNair所有輸出的「QTY」列都是運行總數。查看每一行,就好像PO已經完成了儘可能多的SO,我們記錄了使用了多少個零件,並且如果PO沒有包含足夠的零件或PO中剩餘多少零件,仍然需要多少零件並不是所有的人都被使用過。然後下一行是未完成SO上的下一個PO的效果,或者是當前SO完全滿足時的下一個SO。 – iamdave

回答

1

我發現有點奇怪的解決方案,希望它可以幫助你。也許以後我可以優化它,但現在我張貼的是:

;WITH cte AS (
    SELECT 1 as l 
    UNION ALL 
    SELECT l+1 
    FROM cte 
    WHERE l <= 1000000 
), SO_cte AS (
    SELECT *, 
      ROW_NUMBER() OVER (ORDER BY DueDate ASC) as rn 
    FROM SO s 
    CROSS JOIN cte c 
    WHERE c.l <= s.[Required QTY] 
), PO_cte AS (
    SELECT *, 
      ROW_NUMBER() OVER (ORDER BY DueDate ASC) as rn 
    FROM PO p 
    CROSS JOIN cte c 
    WHERE c.l <= p.[Ordered QTY] 
), almost_done AS (
    SELECT DISTINCT  
      s.SO#, 
      s.DueDate, 
      s.[Part Number], 
      p.PO#, 
      s.[Required QTY], 
      p.[Ordered QTY] 
    FROM SO_cte s 
    LEFT JOIN PO_cte p 
     ON p.rn = s.rn 
), final AS (
    SELECT *, 
      ROW_NUMBER() OVER (ORDER BY DueDate) AS RN 
    FROM almost_done 
) 

SELECT f.SO#, 
     f.DueDate, 
     f.[Part Number], 
     f.[Required QTY], 
     f.PO#, 
     CASE WHEN f.[Ordered QTY]>f.[Required QTY] 
       THEN ISNULL(ABS(f1.[Required QTY]-f1.[Ordered QTY]),f.[Required QTY]) 
       ELSE f.[Ordered QTY] END 
         as [QTY Used], 
     f.[Ordered QTY] - 
     CASE WHEN f1.PO# = f.PO# 
       THEN f1.[Ordered QTY] 
       ELSE 
        CASE WHEN f.[Ordered QTY]>f.[Required QTY] 
          THEN ISNULL(ABS(f1.[Required QTY]-f1.[Ordered QTY]),f.[Required QTY]) 
          ELSE f.[Ordered QTY] END 
     END as [QTY Remain] 
FROM final f 
LEFT JOIN final f1 
    ON f.RN = f1.RN+ 1 
     AND (f.SO# = f1.SO# OR f.PO# = f1.PO#) 
OPTION(MAXRECURSION 0) 

輸出數據您所提供:

SO# DueDate  Part Number Required QTY PO# QTY Used QTY Remain 
100 2016-09-03 1012  2    331 1   0 
100 2016-09-03 1012  2    362 1   0 
101 2016-09-12 1012  1    359 1   4 
107 2016-10-11 1012  4    359 4   0 
103 2016-10-17 1012  7    371 3   0 
103 2016-10-17 1012  7    380 4   6