如何创建存储过程来计算年初库存,库存,缺货,库存余额在SQL Server 2005中
问题描述:
我有3个表:如何创建存储过程来计算年初库存,库存,缺货,库存余额在SQL Server 2005中
-
Product
(Product_Model, Product_Color, Product_Code
) -
StockIn
(StockIn_Date, Product_Code, Product_SerialNo
) -
StockOut
(StockOut_Date, Product_SerialNo
)
我想创建一个存储过程来生成报告requiremen下面吨字段:
- (开始
stock
,stock in
,stock out
,stock balance
) - 组由(
Product_Model
,Product_Color
,Product_Code
) - 过滤器的2个参数:
@StartDate
和@EndDate
如何使用此方案创建存储过程?
答
假设你的表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
答
小时的存储过程,
所有功劳归于Oleg Dok谁发布了上面的脚本。
这里是相同的数据我一起工作:
这里是代码:
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
感谢Oleg Dok的回复。我的情况是:Product_SerialNo是唯一的。所以我将其设置为库存,意味着如果他们库存有1个Product_SerialNo =它有1个库存产品。对于初始股票意味着从激光可用的股票余额(它应该是 Sokea 2012-01-17 06:46:25
@Sokea你看到的草案 - 尝试采用它到您的需求 – 2012-01-17 07:19:21