【问题标题】:using sql join on three tables在三个表上使用 sql join
【发布时间】:2023-03-05 13:07:02
【问题描述】:

我有 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  

表:ItemSale (StockOut)

    Id  ItemId   Qty  BranchID  
    1     7       2       1            
    2     7       3       2   
    3     7       1       1  
    4     6       4       1           
    5     6       2       2           

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

Id ItemId  OpgQty  BranchId StockIn  StockOut  CurrentStock
1    7       0        1        11       3           8
2    7       0        2        6        3           3
3    6       0        1        6        4           2
4    6       0        2        2        2           0

我试图获得预期的结果,但未能如愿。请帮忙!!!

【问题讨论】:

  • 你试过了吗?

标签: sql sql-server sql-server-2012 inner-join


【解决方案1】:

试试这个;

select
m.Id,
m.ItemId,
m.OpgQty,
m.BranchID,
si.StockIn,
m.CurrentStock-si.StockIn StockOut,
m.CurrentStock
from
ItemStock m
inner join
(
select 
ItemId,BranchId,sum(Qty) as StockIn
from
ItemPurchase
group by ItemId,BranchId
) si on si.ItemId=m.ItemId and si.BranchId=m.BranchId 

【讨论】:

  • 这回答了你的问题! @Vivek
  • 我说@vivek 应该尝试你的答案,因为它可以获得所需的输出。
  • @ErsinGülbahar 我在您的回答中看不到使用 ItemSale 表。不确定,如果不使用 ItemSale 表记录,它将如何正常工作。
  • @vivek bacause sale=in - current
【解决方案2】:

给出所需结果的一个非常简单的查询是:

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

【讨论】:

    【解决方案3】:

    group by 和聚合的两个子查询将得到你想要的。

    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 中的demo

    【讨论】:

    • 在实际条目中没有得到想要的结果。对于同一个项目和分支,我获得了不止一条记录。
    • @vivek 我们看不到你的实际条目是什么,所以我们也无法找出哪里错了,这个sql根据你的样本数据得到结果。或者你最好发布你真正想要的。
    【解决方案4】:

    Try This ...我希望你也考虑一下。

    【讨论】:

    • 在实际条目中没有得到想要的结果。对于同一个项目和分支,我得到了不止一个记录。仍在寻找问题所在。
    • @vivek 我的脚本看起来我得到了你想要的输出。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-12-22
    • 2021-04-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多