在三个表上使用sql联接

在三个表上使用sql联接,sql,sql-server,sql-server-2012,inner-join,Sql,Sql Server,Sql Server 2012,Inner Join,我有3个表维护每个产品/项目的库存条目。这三个表如下所示: Table : ItemStock (to maintain remaining stock of each item) Id ItemId OpgQty BranchID CurrentStock 1 7 0 1 8 2 7 0 2 3 3 6 0 1 2 4

我有3个表维护每个产品/项目的库存条目。这三个表如下所示:

Table : ItemStock (to maintain remaining stock of each item)

Id  ItemId  OpgQty  BranchID  CurrentStock
1     7       0       1            8
2     7       0       2            3
3     6       0       1            2
4     6       0       2            0

Table : ItemPurchase (StockIn)

    Id  ItemId   Qty  BranchID  
    1     7       5       1            
    2     7       4       2   
    3     7       6       1  
    4     7       2       2          
    5     6       4       1           
    6     6       2       2           
    7     6       2       1  
表:项目销售(缺货)

所需输出(基于sql查询)
我想得到如下结果:(报告的一部分)


我试图得到想要的结果,但没能做到。请帮忙

使用
groupby
和聚合的两个子查询将得到您想要的结果

select 
    s.*, 
    coalesce([ip].StockIn, 0) as StockIn,  -- In case of no records in ItemPurchase or ItemSale, coalesce is neccessary.
    coalesce([is].StockOut, 0) as StockOut
from ItemStock s
left join (
    select sum(Qty) as StockIn, ItemId, BranchId
    from ItemPurchase
    group by ItemId, BranchId
) [ip] on s.ItemId = [ip].ItemId and s.BranchId = [ip].BranchId
left join (
    select sum(Qty) as StockOut, ItemId, BranchId
    from ItemSale 
    group by ItemId, BranchId
) [is] on s.ItemId = [is].ItemId and s.BranchId = [is].BranchId

请参见sqlfiddle中的内容。

两个子查询和
分组依据和聚合将得到您想要的结果

select 
    s.*, 
    coalesce([ip].StockIn, 0) as StockIn,  -- In case of no records in ItemPurchase or ItemSale, coalesce is neccessary.
    coalesce([is].StockOut, 0) as StockOut
from ItemStock s
left join (
    select sum(Qty) as StockIn, ItemId, BranchId
    from ItemPurchase
    group by ItemId, BranchId
) [ip] on s.ItemId = [ip].ItemId and s.BranchId = [ip].BranchId
left join (
    select sum(Qty) as StockOut, ItemId, BranchId
    from ItemSale 
    group by ItemId, BranchId
) [is] on s.ItemId = [is].ItemId and s.BranchId = [is].BranchId
请参见sqlfiddle。

试试这个; 试试这个; 请 ... 我希望你也考虑一下。
... 我希望你也考虑这个问题。

< P>一个非常简单的给出了预期结果的查询是:

select *,
       (select sum(Qty) 
        from ItemPurchase 
        where ItemPurchase.ItemId = ItemStock.ItemId and 
              ItemPurchase.BranchId = ItemStock.BranchId) as StockIn,
       (select sum(Qty) 
        from ItemSale 
        where ItemSale.ItemId = ItemStock.ItemId and 
              ItemSale.BranchId = ItemStock.BranchId) as StockOut
from ItemStock

提供所需结果的一个非常简单的查询是:

select *,
       (select sum(Qty) 
        from ItemPurchase 
        where ItemPurchase.ItemId = ItemStock.ItemId and 
              ItemPurchase.BranchId = ItemStock.BranchId) as StockIn,
       (select sum(Qty) 
        from ItemSale 
        where ItemSale.ItemId = ItemStock.ItemId and 
              ItemSale.BranchId = ItemStock.BranchId) as StockOut
from ItemStock


你试过什么了吗?你试过什么了吗?这回答了你的问题@VivekI说@vivek应该试试你的答案,因为它得到了想要的结果。@ErsinGülbahar我在你的答案中没有看到ItemSale表的用法。不确定,如果不使用ItemSale表记录,它将如何正确工作。@vivek bacause sale=in-current这回答了您的问题@VivekI说@vivek应该试试你的答案,因为它得到了想要的结果。@ErsinGülbahar我在你的答案中没有看到ItemSale表的用法。不确定,如果不使用ItemSale表记录,它将如何正常工作。@vivek bacause sale=in-current无法在实际条目上获得所需的结果。对于同一项和分支,我得到了多条记录。@vivek我们无法看到您的实际条目,因此我们也无法找出哪里出错,此sql将根据您的示例数据获得结果。或者你最好发布你真正想要的。在实际输入中没有得到想要的结果。对于同一项和分支,我得到了多条记录。@vivek我们无法看到您的实际条目,因此我们也无法找出哪里出错,此sql将根据您的示例数据获得结果。或者你最好发布你真正想要的。在实际输入中没有得到想要的结果。我获得了同一项目和分支的多个记录。仍然在寻找问题所在。@vivek我的脚本看起来像得到了您想要的输出。实际输入没有得到想要的结果。我获得了同一项目和分支的多个记录。仍然在寻找问题所在。@vivek我的脚本看起来像得到了您想要的输出。
select *,
       (select sum(Qty) 
        from ItemPurchase 
        where ItemPurchase.ItemId = ItemStock.ItemId and 
              ItemPurchase.BranchId = ItemStock.BranchId) as StockIn,
       (select sum(Qty) 
        from ItemSale 
        where ItemSale.ItemId = ItemStock.ItemId and 
              ItemSale.BranchId = ItemStock.BranchId) as StockOut
from ItemStock