这一切都必须是假的,因为我在手机上并且现在没有互联网访问权限,因为我刚刚移动了但是它却把我的垃圾扯掉了。这也意味着我不能做代码块,请耐心等待:我会试试。
我有一张包含金额的表格,我有一张带标签的表格。我想对按标签分组的第一个表中的金额求和。问题是,如果表中存在的金额没有记录,那么我就不会在该标签的结果集中得到记录。我需要一个记录,其数量表字段为空。以下是一些示例数据的样子:
列:id,tpa,amt,link_to_label_table
数据:
1, GTL, 2000, 1
2, GTL, 1000, 1
列:link_to_amount_table,label_name
数据:
1, Label1
2, Label2
Select at.tpa, sum(at.amt) as amt, lt.label_name
From Amount_table as at
Left join Label_tabl lt on lt.link_to_amount_table = at.link_to_label_table
Where at.tpa = 'GTL'
Group by lt.label, at.tpa
现在返回:
GTL, 3000, Label1
我尝试从标签表中选择然后离开加入金额表,它仍然没有给出我想要的结果:
GTL, 3000, Label1
Null, Null, Label2
这可能与总和和组合吗?被分组的字段必须在那里否则您会收到错误。 顺便说一句,这是在DB2中。有没有办法让这个回归我需要的方式?我必须得到标签;他们很有活力。
答案 0 :(得分:2)
从表面上看,您希望将标签表作为主导表,将金额表作为外部连接表。
SELECT a.tpa, sum(a.amt) as amt, l.label_name
FROM Label_table AS l
LEFT JOIN Amount_table AS a
ON l.link_to_amount_table = a.link_to_label_table
GROUP BY l.label, a.tpa
您的条件为Amount_table.tpa = 'GTL'
;现在还不完全清楚为什么你有这个,但可能在表中有更多数据时它很重要。有(至少)两种方法可以将该条件合并到查询中(除了您选择的那个 - 这消除了a.tpa
为空的行)。
SELECT a.tpa, sum(a.amt) as amt, l.label_name
FROM Label_table AS l
LEFT JOIN Amount_table AS a
ON l.link_to_amount_table = a.link_to_label_table
AND a.tpa = 'GTL'
GROUP BY l.label, a.tpa
或者:
SELECT a.tpa, sum(a.amt) as amt, l.label_name
FROM Label_table AS l
LEFT JOIN (SELECT *
FROM Amount_table
WHERE tpa = 'GTL') AS a
ON l.link_to_amount_table = a.link_to_label_table
GROUP BY l.label, a.tpa
一个不错的优化器会为两者生成相同的查询计划,因此您使用哪个并不重要。有一个论点表明第二种选择更清晰,因为ON子句主要用于连接条件,a.tpa
上的过滤条件不是连接条件。还有另一个论点说第一个备选方案避免了子查询,因此更为可取。我确认查询计划是相同的,可能会选择第二个,但这是一个基于温和偏好的有点模糊的决定。
答案 1 :(得分:0)
你第二次尝试时非常接近。将WHERE更改为AND。这具有将at.tpa ='GTL'应用于JOIN而不是将其应用于过滤器的效果,因此您不会过滤掉NULL。