SQL查询在视图表中计算库存

时间:2018-12-28 05:58:35

标签: sql sql-server

我有两个表StockIn和StockOut,我想创建一个视图表来显示手中的库存。我能够实现,但是如果特定产品在StockIn表中输入并且没有售罄,并且在StockOut表中没有其条目,那么在我的视图表中该特定产品的现有库存显示为空。请谁能解决这个问题。

下面是我的查询:

SELECT
  si.Id,
  si.AId,
  si.AssetsName,
  si.PTypeId,
  si.ProductType, 
  si.Rate,
  si.Qty,  

 SUM(so.QtyOut) AS QtyOut,  
 COALESCE(si.Qty, 0) - SUM(so.QtyOut) AS StockInHand
FROM dbo.StockIn si 
LEFT JOIN dbo.StockOut so ON so.Id = si.Id
GROUP BY 
  si.Id,
  si.AId,
  si.AssetsName,
  si.PTypeId,
  si.ProductType, 
  si.Rate,
  si.Qty
  ;
GO

enter image description here

2 个答案:

答案 0 :(得分:3)

您需要在左侧联接的右侧一侧的表中的数量上使用servaddr = EmptyStruct; cliaddr = EmptyStruct;

COALESCE

这里的问题是,在连接过程中,给定的SELECT si.Id, si.AId, si.AssetsName, si.PTypeId, si.ProductType, si.Rate, si.Qty, COALESCE(SUM(so.QtyOut), 0) AS QtyOut, si.Qty - COALESCE(SUM(so.QtyOut), 0) AS StockInHand FROM dbo.StockIn si LEFT JOIN dbo.StockOut so ON so.Id = si.Id GROUP BY si.Id, si.AId, si.AssetsName, si.PTypeId, si.ProductType, si.Rate, si.Qty; 条目可能与StockIn表中的任何内容都不匹配。在这种情况下,从逻辑上讲,您希望StockOut丢失的数量变为零。

答案 1 :(得分:1)

您需要按以下方式处理NULL情况

 isnull(SUM(so.QtyOut),0) AS QtyOut,  
 COALESCE(si.Qty, 0) - isnull(SUM(so.QtyOut),0) AS StockInHand

在算术运算中,如果一侧为NULL,则结果变为NULL

因此,如上所述,将这些NULL值设置为ZERO