DISTINCT在左联接中无法正常工作

时间:2018-10-19 04:44:46

标签: sql sql-server

我有两个表StockInStockOut

StockIn表具有该产品的ID号,此ID号在StockIn表中是唯一的,否则该ID号将在StockOut表中重复多次,库存将售罄。

现在,我想创建一个视图来查找手中StockIn.Id = StockOut.Id的股票。到目前为止,我设法进行查询,并且给出了结果,但是当同一产品的StockOut表中有多个订单时,由于ID号重复,因此失败。

下面是我的查询:

select DISTINCT
  i.Id, 
  i.AssetsName, 
  i.Rate,
  i.Qty,
  So.QtyOut,  
   Balance =  sum( COALESCE(i.Qty,0)- COALESCE(so.QtyOut,0)) OVER(PARTITION BY i.id)
  from  dbo.StockIn i 
  LEFT Join  StockOut So
    on   i.Id =   So.Id
GO

3 个答案:

答案 0 :(得分:1)

具有常规SUM的简单GROUP BY应该可以。

<svgicon name="icon" :original="true" />

答案 1 :(得分:0)

在加入股票之前,最好将股票分拆为单行

删除不重复项-它无用且不需要

select 
  id, 
  si.qtyin - so.qtyout as balance
from
  stockin si
  left join
  (select id, sum (qtyout) as qtyout from stockout group by id) so 
  on so.id = si.id

这意味着您的加入将永远只有1:0(如果没有销售)或1:1(所有销售在加入前加总)

订购更多东西会怎样?如果您创建另一个具有相同ID的库存记录,那么对于已重新库存的产品,也会发生相同的问题。加入之前,请使用相同的技术将stockin折叠为一行:

select 
  id, 
  si.qtyin - so.qtyout as balance
from
  (Select id, sum(qtyin) as qtyin stockin group by id) si
  left join
  (select id, sum (qtyout) as qtyout from stockout group by id) so 
  on so.id = si.id

答案 2 :(得分:0)

尝试

  select 
  i.Id, 
  i.AssetsName, 
  i.Rate,
  i.Qty,
  sum( COALESCE(i.Qty,0)- COALESCE((Select Qtyout from StockIn Where StockIn.Id=StockOut.Id),0)) OVER(PARTITION BY i.id) as Balance
  from  dbo.StockIn i 
  group by Id,AssetsName,Rate,Qty