[英]SQL - One to Many join with left outer join
SQL Server 2008 R2
我有2张桌子
表格1
Col1 Col2 Col3 Col4
123 08 1 1
123 08 1 1
123 08 2 1
表2
Col1 Col2 Col3
123 08 6
表1是主列,因此大多数数据都来自该表,并且它必须是对Table2的LEFT OUTER JOIN,因为Table1的值(col1,col2)并不总是在TABLE2中返回值,因此应显示为NULL。
我的查询是
SELECT
a.Col2,
SUM(a.Col3),
SUM(a.Col4),
SUM(b.Col3)
FROM
Table 1 a
LEFT OUTER JOIN Table2 b
ON a.col1 = b.col1 AND a.col2 = b.col2
GROUP BY a.Col2
这将返回08、4、3、18
我希望它返回08、4、3、6
因为表2在3行上联接,所以它将b.Sol3的SUM值增加了三倍。
最好的解决方案是什么?
如果不想b.Col3
记录,可以将b.Col3
添加到GROUP BY:
SELECT
a.Col2,
SUM(a.Col3),
SUM(a.Col4),
b.Col3
FROM
Table 1 a
LEFT OUTER JOIN Table2 b
ON a.col1 = b.col1 AND a.col2 = b.col2
GROUP BY a.Col2, b.Col3
请尝试这个。 如果您在表2中有两个相同的col1和col2记录,这也将引起注意。
SELECT
a.Col2,
SUM(a.Col3),
SUM(a.Col4),
MAX(b.Col3) FROM
Table 1 a
LEFT OUTER JOIN (select col1, col2, sum(col3) as col3 from Table2 group by col1, col2) b ON a.col1 = b.col1 AND a.col2 = b.col2
GROUP BY
a.Col2
如果您在第四栏想要的结果不是总和,那么目前还不清楚你想要什么。 如果您可以依靠每个组的所有行在该列中具有相同的值(在您的示例中将具有相同的值,但可能不会具有不同的数据),并且如果这是您想要的值,则可以使用此值:
SELECT
a.Col2,
SUM(a.Col3),
SUM(a.Col4),
MIN(b.Col3)
FROM
Table 1 a
LEFT OUTER JOIN Table2 b
ON a.col1 = b.col1 AND a.col2 = b.col2
GROUP BY a.Col2
当然,您也可以使用MAX()
而不是MIN()
。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.