通过加入多表

时间:2013-06-29 15:17:09

标签: sql join

我有三个表1. ItemMaster 2. GRN 3.问题

Item Master
------------------
ItemCode          ItemDescr
--------          ---------
1                 Test1
2                 Test2
3                 Test3
4                 Test4
5                 Test5

GRN Table
-------------------
ItemCode          grnQty
--------         --------
1                 1
1                 2
2                 1
1                 2
2                 1
3                 1

Issue Table

ItemCode         issQty
--------         -------
1                 1
1                 2
2                 1
4                 1

我想生成类似于 - >

的报告/视图
ItemCode          ItemDescr      GRN Qty      Issue Qty  
--------          ---------      -------      ---------         
1                  Test1          5              3                 
2                  Test2          2               1                 
3                  Test3          1               0
4                  Test4          0               1
5                  Test5          0               0

为此,我使用了以下sql代码:

select a.ItemCode, a.ItemDescr, isnull(sum(b.grnQty),0) as 'GRN Qty', isnull(sum(c.issQty),0) as 'Issue Qty' from
ItemMaster a
left join GRN b
on a.ItemCode=b.ItemCode
left join Issue c
on a.ItemCode=c.ItemCode
group by a.ItemCode, a.ItemDescr

但生成的报告是

ItemCode          ItemDescr      GRN Qty      Issue Qty  
--------          ---------      -------      ---------         
1                  Test1          10              9                 
2                  Test2          2               2                 
3                  Test3          1               0
4                  Test4          0               1
5                  Test5          0               0

我的代码有什么问题???

GRN数量10 = 5 X(项目代码1的问题表中的行数没有)可能只是一个巧合,而其他值如问题数量9 = 3 X(项目代码的GRN表中没有行数) 2)

请帮助。

1 个答案:

答案 0 :(得分:1)

这里没有问题,你所描述的正是你的问题。请查看简化查询的结果:

select a.ItemCode, a.ItemDescr, b.grnQty as 'GRN Qty', c.issQty as 'Issue Qty' 
from ItemMaster a
left join GRN b on a.ItemCode=b.ItemCode
left join Issue c on a.ItemCode=c.ItemCode

此表格看起来像(只是ItemCode = 1的行):

ItemCode          ItemDescr      GRN Qty      Issue Qty  
--------          ---------      -------      ---------         
1                  Test1         1            1                 
1                  Test1         2            1                 
1                  Test1         2            1                 
1                  Test1         1            2                 
1                  Test1         2            2                 
1                  Test1         2            2                

现在添加你的小组+总结结束你最终到达目的地。

所以你不能直接在带有两个连接的select上进行求和,因为你最终得到了连接的所有排列。

所以子查询在这里可以提供帮助:

select 
    a.ItemCode, 
    a.ItemDescr, 
    (select sum(b.grnQty) from GRN b where a.ItemCode=b.ItemCode) as 'GRN Qty', 
    (select sum(c.issQty) from Issue c where a.ItemCode=c.ItemCode) as 'Issue Qty' 
from ItemMaster a