[英]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.