[英]How to create stored procedure to calculate beginning stock, stock in, stock out, stock balance in SQL Server 2005
I have 3 tables: 我有3张桌子:
Product
( Product_Model, Product_Color, Product_Code
) Product
( Product
Product_Model, Product_Color, Product_Code
Product
Product_Model, Product_Color, Product_Code
Product
) StockIn
( StockIn_Date, Product_Code, Product_SerialNo
) StockIn
( StockIn_Date, Product_Code, Product_SerialNo
) StockOut
( StockOut_Date, Product_SerialNo
) StockOut
( StockOut_Date, Product_SerialNo
) I want to create a stored procedure to generate report with requirement fields below: 我想创建一个存储过程以生成带有以下需求字段的报告:
stock
, stock in
, stock out
, stock balance
) stock
期初, stock in
, stock out
, stock balance
) Product_Model
, Product_Color
, Product_Code
) Product_Model
, Product_Color
, Product_Code
)分组 @StartDate
and @EndDate
@StartDate
和@EndDate
How to create a stored procedure with this scenario? 如何在这种情况下创建存储过程?
Assuming that your tables StockIn and StockOut have a column Amount , instead the question is senseless. 假设您的表StockIn和StockOut的列为 Amount ,那么这个问题就没有意义了。
So, the ugly and the simple query is: 因此,丑陋而简单的查询是:
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
And the answer - to create the stored procedure you have to use CREATE PROCEDURE
statement as described here 而答案 -创建存储过程,你必须使用
CREATE PROCEDURE
语句描述这里
CREATE PROC YourProcName
@StartDate datetime,
@EndDate datetime
AS
BEGIN
SET NOCOUNT ON;
the query
END
H, H,
All credit to Oleg Dok who posted the script above. 所有归功于上面发布脚本的Oleg Dok。
Here is the same Data I am working with: 这是我正在使用的相同数据:
Here is the Code: 这是代码:
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
Here is the Output: 这是输出:
Product_Code Product_Color Product_Model BeginningStock StockIn StockOut StockBalance
1 red 123 5 0 3 2
2 red 456 10 0 3 7
Is this what you wanted? 这就是你想要的吗?
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.