2012-01-17 101 views
0

我有3個表:如何創建存儲過程來計算年初庫存,庫存,缺貨,庫存餘額在SQL Server 2005中

  • ProductProduct_Model, Product_Color, Product_Code
  • StockInStockIn_Date, Product_Code, Product_SerialNo
  • StockOutStockOut_Date, Product_SerialNo

我想創建一個存儲過程來生成報告requiremen下面噸字段:

  • (開始stockstock instock outstock balance
  • 組由(Product_ModelProduct_ColorProduct_Code
  • 過濾器的2個參數:@StartDate@EndDate

如何使用此方案創建存儲過程?

回答

0

假設你的表StockIn缺貨有一列金額,而不是問題是毫無意義的。

因此,醜陋的和簡單的查詢是:

SELECT 
    BeginningStockIn 
    IsNull(BeginningStockIn.Amount, 0)-IsNull(BeginningStockOut.Amount, 0) BeginningStock, 
    IsNull(PeriodStockIn.Amount, 0) StockIn, 
    IsNull(PeriodStockOut.Amount, 0) StockOut, 
    IsNull(BeginningStockIn.Amount, 0)-IsNull(BeginningStockOut.Amount, 0)+IsNull(PeriodStockIn.Amount, 0)-IsNull(PeriodStockOut.Amount, 0) StockBalance 
FROM Product 
LEFT JOIN 
(
    SELECT 
    SUM(Amount) Amount, 
    Product_Code 
    FROM StockIn 
    WHERE StockIn_Date < @StartDate 
) BeginningStockIn ON BeginningStockIn.Product_Code = Product.Product_Code 
LEFT JOIN 
(
    SELECT 
    SUM(Amount) Amount, 
    Product_Code 
    FROM StockOut 
    WHERE StockOut_Date < @StartDate 
) BeginningStockOut ON BeginningStockOut.Product_Code = Product.Product_Code 
LEFT JOIN 
(
    SELECT 
    SUM(Amount) Amount, 
    Product_Code 
    FROM StockIn 
    WHERE StockIn_Date >= @StartDate AND StockIn_Date < @EndDate 
) PeriodStockIn ON PeriodStockIn .Product_Code = Product.Product_Code 
LEFT JOIN 
(
    SELECT 
    SUM(Amount) Amount, 
    Product_Code 
    FROM StockOut 
    WHERE StockOut_Date >= @StartDate AND StockOut_Date < @EndDate 
) PeriodStockOut ON PeriodStockOut.Product_Code = Product.Product_Code 

而且答案 - 創造您必須使用CREATE PROCEDURE語句描述here

CREATE PROC YourProcName 
    @StartDate datetime, 
    @EndDate datetime 
AS 
BEGIN 
    SET NOCOUNT ON; 

    the query 

END 
+0

感謝Oleg Dok的回覆。我的情況是:Product_SerialNo是唯一的。所以我將其設置爲庫存,意味着如果他們庫存有1個Product_SerialNo =它有1個庫存產品。對於初始股票意味着從激光可用的股票餘額(它應該是<= @ FromDate) – Sokea 2012-01-17 06:46:25

+0

@Sokea你看到的草案 - 嘗試採用它到您的需求 – 2012-01-17 07:19:21

0

小時的存儲過程,

所有功勞歸於Oleg Dok誰發佈了上面的腳本。

這裏是相同的數據我一起工作:

enter image description here


這裏是代碼:

declare @startdate date = '2012-01-02' 
declare @enddate date = '2012-01-31' 

SELECT 
    Product.Product_Code, 
    Product.Product_Color, 
    Product.Product_Model, 
    IsNull(BeginningStockIn.Amount, 0)-IsNull(BeginningStockOut.Amount, 0) BeginningStock, 
    IsNull(PeriodStockIn.Amount, 0) StockIn, 
    IsNull(PeriodStockOut.Amount, 0) StockOut, 
    IsNull(BeginningStockIn.Amount, 0)-IsNull(BeginningStockOut.Amount, 0)+IsNull(PeriodStockIn.Amount, 0)-IsNull(PeriodStockOut.Amount, 0) StockBalance 
FROM Product 
LEFT JOIN 
(
    SELECT 
    SUM(Amount) Amount, 
    Product_Code 
    FROM StockIn 
    WHERE StockIn_Date < @StartDate 
    group by Product_Code 
) BeginningStockIn ON BeginningStockIn.Product_Code = Product.Product_Code 
LEFT JOIN 
(
    SELECT 
    SUM(Amount) Amount, 
    Product_Code 
    FROM StockOut 
    WHERE StockOut_Date < @StartDate 
    group by Product_Code 
) BeginningStockOut ON BeginningStockOut.Product_Code = Product.Product_Code 
LEFT JOIN 
(
    SELECT 
    SUM(Amount) Amount, 
    Product_Code 
    FROM StockIn 
    WHERE StockIn_Date >= @StartDate AND StockIn_Date < @EndDate 
    group by Product_Code 
) PeriodStockIn ON PeriodStockIn .Product_Code = Product.Product_Code 
LEFT JOIN 
(
    SELECT 
    SUM(Amount) Amount, 
    Product_Code 
    FROM StockOut 
    WHERE StockOut_Date >= @StartDate AND StockOut_Date < @EndDate 
    group by Product_Code 
) PeriodStockOut ON PeriodStockOut.Product_Code = Product.Product_Code 

這裏是輸出:

Product_Code Product_Color Product_Model BeginningStock StockIn StockOut StockBalance 
1 red 123 5 0 3 2 
2 red 456 10 0 3 7 

是這是你想要的嗎?

+0

謝謝賽義德拉赫曼,但在我的情況下,我控制股票交易Product_SerialNo,因爲它是唯一的,而不是金額。恩。在StockIn中我有Product_SerialNo:12345,如果12345沒有在StockOut表示它有1個庫存。 – Sokea 2012-01-17 07:20:13