简体   繁体   English

如何在SQL Server 2005中创建存储过程以计算期初库存,库存,库存,库存余额

[英]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 ) ProductProduct Product_Model, Product_Color, Product_Code Product Product_Model, Product_Color, Product_Code Product
  • StockIn ( StockIn_Date, Product_Code, Product_SerialNo ) StockInStockIn_Date, Product_Code, Product_SerialNo
  • StockOut ( StockOut_Date, Product_SerialNo ) StockOutStockOut_Date, Product_SerialNo

I want to create a stored procedure to generate report with requirement fields below: 我想创建一个存储过程以生成带有以下需求字段的报告:

  • (beginning stock , stock in , stock out , stock balance ) stock期初, stock instock outstock balance
  • Group by ( Product_Model , Product_Color , Product_Code ) 按( Product_ModelProduct_ColorProduct_Code )分组
  • Filter by 2 parameters: @StartDate and @EndDate 通过2个参数过滤: @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. 假设您的表StockInStockOut的列为 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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM