sum left join 多次引发的问题

--测试数据如下
create table tbla
(
    typename varchar(50)
)
insert into tbla
select 'dt-051' union all
select 'dt-052' union all
select 'dt-053' union all
select 'dt-054' union all
select 'dt-055' union all
select 'dt-056'


create table tblb
(
    typename varchar(50),
    num int,
)
insert into tblb
select 'dt-056',30 union all
select 'dt-056',20 union all
select 'dt-051',10 union all
select 'dt-052',30 union all
select 'dt-053',20 union all
select 'dt-051',30


create table tblc
(
    typename varchar(50),
    num int,
)
insert into tblc
select 'dt-056',30 union all
select 'dt-055',20 union all
select 'dt-056',20 union all
select 'dt-055',30 union all
select 'dt-051',50 union all
select 'dt-053',10

select a.typename as 型号,sum(isnull(b.num,0)) as 共领料 
from tbla as a 
left join tblb as b on b.typename = a.typename 
group by a.typename
order by a.typename asc
--结果没有问题
/*
dt-051    40
dt-052    30
dt-053    20
dt-054    0
dt-055    0
dt-056    50
*/

select a.typename as 型号,sum(isnull(c.num,0)) as 共入库 
from tbla as a 
left join tblc as c on c.typename = a.typename 
group by a.typename
order by a.typename asc

--结果没有问题
/*
dt-051    50
dt-052    0
dt-053    10
dt-054    0
dt-055    50
dt-056    50
*/

--但是
select a.typename as 型号,sum(isnull(b.num,0)) as 共领料,sum(isnull(c.num,0)) as 共入库 
from tbla as a 
left join tblb as b on b.typename = a.typename 
left join tblc as c on c.typename = a.typename 
group by a.typename,b.typename,c.typename
order by a.typename asc

--结果就出现问题了
/*
dt-051    40    100
dt-052    30    0
dt-053    20    10
dt-054    0    0
dt-055    0    50
dt-056    100    100
*/

--正常结果如下
/*
dt-051    40    50
dt-052    30    0
dt-053    20    10
dt-054    0    0
dt-055    0    50
dt-056    50    50
*/



--使用如下的sql语句 结果正确 
select a.typename,isnull(b.sumnum,0) as 共领料,isnull(c.sumnum,0) as 共入库
from tbla as a
left join (select typename,sum(num) as sumnum from tblb group by typename)
b on b.typename = a.typename
left join (select typename,sum(num) as sumnum from tblc  group by typename)
c on c.typename = a.typename
order by a.typename asc
--结果
/*
dt-051    40    50
dt-052    30    0
dt-053    20    10
dt-054    0    0
dt-055    0    50
dt-056    50    50
*/


--多次联合查询会造成如下问题
select a.typename as 型号,isnull(b.num,0) as 共领料,isnull(c.num,0) as 共入库
from tbla as a
left join tblb as b on b.typename = a.typename
left join tblc as c on c.typename = a.typename


/*
dt-051    10    50
dt-051    30    50
dt-052    30    0
dt-053    20    10
dt-054    0    0
dt-055    0    20
dt-055    0    30
dt-056    30    30
dt-056    30    20
dt-056    20    30
dt-056    20    20
*/


--提供另外的写法

select a.typename as 型号,
       isnull(bb.outqty,0) as'共领料',
       isnull(cc.inqty,0) as'共入库'from tbla as a 
outer apply(selectsum(num) outqty from tblb as b 
            where b.typename=a.typename) bb 
outer apply(selectsum(num) inqty from tblc as c 
            where c.typename=a.typename) cc



--在提供一个写法

WITH B AS
(
    SELECT typename,SUM(num) AS num FROM tblb GROUPBY typename
),
C AS
(
    SELECT typename,SUM(num) AS num FROM tblc GROUPBY typename
)
SELECT 
    A.typename,
    ISNULL(B.num,0)  AS 共领料,
    ISNULL(C.num,0) AS 共入库 
FROM tbla AS A
LEFTJOIN B
    ON A.typename = B.typename
LEFTJOIN C
    ON A.typename = C.typename

 

转载于:https://www.cnblogs.com/acyy/archive/2012/08/16/2642749.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值