Sql DISTINCT在左联接中工作不正常

Sql DISTINCT在左联接中工作不正常,sql,sql-server,Sql,Sql Server,我有两张进货和缺货的桌子 库存表中有产品的Id号,此Id号在库存表中是唯一的,否则此Id号将在库存售罄时在库存表中重复 现在我想创建一个视图来查找库存,其中StockIn.Id=StockOut.Id。到目前为止,我设法进行了查询,它给出了结果,但当同一产品的缺货表中有多个订单时,由于Id号重复,查询失败 以下是我的疑问: select DISTINCT i.Id, i.AssetsName, i.Rate, i.Qty, So.QtyOut, Balance

我有两张进货和缺货的桌子

库存表中有产品的Id号,此Id号在库存表中是唯一的,否则此Id号将在库存售罄时在库存表中重复

现在我想创建一个视图来查找库存,其中StockIn.Id=StockOut.Id。到目前为止,我设法进行了查询,它给出了结果,但当同一产品的缺货表中有多个订单时,由于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

你最好在加入之前把你的股票分成一行

删除distinct-它没有帮助,也不需要

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的库存记录,那么对于重新库存的产品,同样的问题也会发生。在加入之前,使用相同的技术将库存折叠到一行:

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
试试这个

  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

一个简单的组,由正常和的应该做

SELECT
 si.Id, 
 si.AssetsName, 
 si.Rate,
 si.Qty,
 SUM(so.QtyOut) AS QtyOut,  
 COALESCE(si.Qty, 0) - SUM(so.QtyOut) AS Balance
FROM dbo.StockIn si 
LEFT JOIN dbo.StockOut so ON so.Id = si.Id
GROUP BY si.Id, si.AssetsName, si.Rate, si.Qty;

请提供您的预期输出示例查询和数据,请使用预期输出组,因为它已使其唯一。如果有一组风暴,不需要区分,就像一个魅力如此完美。