表:TAB1
id date_time zoneid accountid slotid trequest bidder width height
_50832 2017-09-04 15:41:06 153 1654 153x468x60 10 aaa 468 60
_50832 2017-09-04 15:41:06 152 1654 152x468x60 10 bbb 468 60
表:TAB2
id date_time zoneid accountid slotid bidder count
_50832 2017-09-04 15:41:06 152 1654 152x468x60 bbb 6
_50832 2017-09-04 15:41:06 152 1654 152x468x60 bbb 4
_50832 2017-09-04 15:41:06 153 1654 153x468x60 aaa 9
_50832 2017-09-04 15:41:06 153 1654 153x468x60 aaa 1
下面是我的查询:
SELECT SUM(req.trequest) as REQ, SUM(win.count) as IMP
FROM tab1 as req
JOIN tab2 as win ON (req.id=win.id AND req.zoneid=win.zoneid)
GROUP BY req.zoneid
我得到以下结果,
REQ IMP
20 10
20 10
IMP计数是正确的,但我的REQ计数错误。我的预期结果是
REQ IMP
10 10
10 10
如何获得我的预期结果?
答案 0 :(得分:2)
让我们根据zoneid和id分别找到trequest
和count
的总和。然后在内部联接中使用这两个结果( t1 and t2 )
。
问题中显示的计数不匹配问题是由于满足连接条件的多行而发生的。
在此解决方案中,我们在结果zoneid
中的每个( t1 and t2 )
只有一个条目。所以问题就避免了。
注意:如果id
子句没有任何区别,您可以从GROUP BY
子句中删除。
SELECT t1.id, t1.zoneid, t1.REQ, t2.IMP FROM
(SELECT id,zoneid,SUM(trequest) as REQ
FROM tab1 GROUP BY zoneid,id ) t1
INNER JOIN
(SELECT id,zoneid SUM(win.count) as IMP
FROM tab2 GROUP BY zoneid,id ) t2
ON t1.id = t2.id
AND t1.zoneid = t2.zoneid
答案 1 :(得分:1)
在连接表之后,让我们首先尝试求和win.count
并在子查询中对记录进行分组。请尝试以下方法:
SELECT SUM(req.trequest) as REQ, SUM(win.count) as IMP
FROM tab1 as req
JOIN (
SELECT SUM(win.count) as IMP, win.zoneid, win.id
FROM tab2 as win
GROUP BY win.zoneid, win.id) AS win ON req.id=win.id AND req.zoneid=win.zoneid
GROUP BY req.zoneid
答案 2 :(得分:0)
而不是req.zoneid
。你应该试试win.zoneid
。看起来表1中的行被多次计数,因为表2中的zoneid来了两次。因此win.zoneid
会对其进行分组并避免重复。
更新:@mayur panchal发布的解决方案是正确的,因为您不需要对第一个表中的行进行SUM,因为它们属于不同的zoneid。如果你理解它们,你显然会重复20次。