简体   繁体   English

SQL Server左联接与3个表

[英]SQL Server Left Join with 3 tables

I'm newbie in SQL Server and need some help about join query with 3 tables : 我是SQL Server的新手,需要有关3个表的联接查询的帮助:

Table A:                      Table B:                Table C:

ID          Name               ID      Qty            ID      Qty
======      ======            ======   ======         ======  ======
1           Name 1             1       10             1       20  
2           Name 2             1       20  
3           Name 3             2       15  
4           Name 4             3       25  

I think I need to do a LEFT JOIN, but my code doesn't seem to work: 我想我需要做一个左联接,但是我的代码似乎不起作用:

SELECT
    A. NAME,
    SUM(B.Qty) AS QtyB,
    SUM(C.QTY) AS QtyC
FROM
    Table_A A
LEFT JOIN 
    Table_B B ON A.ID = B.ID
LEFT JOIN 
    Table_C C ON A.ID = C.ID
GROUP BY
    A. NAME

Result: 结果:

Name        QtyB     QtyC   
======      =====    ======   
Name 1      30       40 
Name 2      15       Null            
Name 3      25       Null            
Name 4      Null     Null            

What am I doing wrong here? 我在这里做错了什么? Thanks in advance. 提前致谢。

The problem is that the JOIN multiplies rows. 问题是JOIN将行相乘。 One solution is to pre-aggregate along the dimensions: 一种解决方案是沿维度进行预聚合:

SELECT A.NAME, QtyB, SUM(C.QTY) As QtyC
FROM Table_A A LEFT JOIN
     (SELECT B.ID, SUM(B.Qty) AS QtyB
      FROM Table_B B
      GROUP BY B.ID
     ) B
     ON A.ID = B.ID LEFT JOIN
     Table_C C
     ON A.ID = C.ID
GROUP BY A.NAME;

Try this, group By Name is bad idea (because name can be same), 尝试此操作,按名称分组不是个好主意(因为名称可以相同),

declare @TableA table(ID int,Name varchar(50))
insert into @TableA values    
(1,'Name 1')      
,(2,'Name 2')      
,(3,'Name 3')      
,(4,'Name 4')      


 declare @TableB table( ID int,Qty int  )   
insert into @TableB values  
 ( 1 , 10  )    
 ,( 1,  20 ) 
 ,( 2,  15 ) 
 ,( 3,  25 ) 

  declare @TableC table(ID int, Qty int)
insert into @TableC values (1 ,20  )

;With CTE as
(
select a.id,sum(b.Qty)BQTY,sum(c.Qty)CQty
FROM @TableA A
left join @TableB B on a.ID=b.ID
left join    @tableC C on a.id=c.id
group by a.id
)
select a.Name,bqty,cqty from cte c
inner join @TableA A on c.id=a.id

EDIT: The answer by Gordon Linoff solves this in a better way. 编辑:戈登·利诺夫(Gordon Linoff)的答案以一种更好的方式解决了这个问题。

If you're expecting 0 instead of NULL, you can translate that using the ISNULL function. 如果期望0而不是NULL,则可以使用ISNULL函数将其转换。

SELECT
    A.NAME,
    ISNULL(SUM(B.Qty),0) AS QtyB,
    ISNULL(SUM(C.QTY),0) As QtyC
FROM 
    Table_A A
LEFT JOIN 
    Table_B B ON A.ID = B.ID
LEFT JOIN 
    Table_C C ON A.ID = C.ID
GROUP BY 
    A.NAME

This, of course, depends on what your expected output is (which I'm waiting for the response on). 当然,这取决于您的预期输出是什么(我正在等待响应)。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM