2012-04-07 54 views
2

我已经成功合并了3个表(使用ID),但是当我尝试添加第4个表时 - 输出完全失败(值变得不现实/错误),所以我认为我与这个事实有关,即第4张桌子已经取消了分组ID,所以我需要在加入这张新桌子之前对他们进行分组。眼下查询如下:在与另一个表合并之前按参数分组一个表

SELECT name, SUM(money) AS MONEY 
FROM transactions 
JOIN results ON transactions.id = results.id 
JOIN more ON results.per_id = more.per_id 
GROUP BY name 
HAVING SUM(money)>500 

,当我加入新表:

SELECT name, SUM(money) AS MONEY, SUM(data_from_NT1), SUM(data_from_NT2) 
FROM transactions 
JOIN results ON transactions.id = results.id 
JOIN more ON results.per_id = more.per_id 

JOIN newtable ON results.per_id = newtable.per_id 

GROUP BY name 
HAVING SUM(money)>500 

是有可能通过per_id执行命令组:

(JOIN newtable ON results.per_id = newtable.per_id GROUP BY per_id) 

前将这个新表添加到主表中?上面的行不起作用。如果小组per_id,任何其他列,必须聚集

join (
     select per_id 
     ,  sum(col1) as col1_avg 
     ,  avg(col2) as col2_avg 
     from newtable 
     group by 
       per_id 
     ) as newtable 
on  results.per_id = newtable.per_id 

+1

新表与结果之间存在哪种类型的关系?新表中可能有0个,一个或多个记录?我问,因为在交易和结果中你的结果值会加倍,如果per_ID不存在于更多或新表中,某些记录可能会被删除。这可能是您想要使用LEFT连接而不是完整连接。一些数据与预期结果一起输出将有助于在这里找出问题。 – xQbert 2012-04-07 19:15:24

回答

1

是的,这是可能的,但你必须把它写成一个SELECT。这是一个可能的答案的第一个版本:

SELECT name, 
     SUM(money)    AS money, 
     SUM(nt2.data_from_NT1) AS data_from_NT1, 
     SUM(nt2.data_from_NT2) AS data_from_NT2 
    FROM transactions AS t 
    JOIN results  AS r ON t.id = r.id 
    JOIN more   AS m ON r.per_id = m.per_id 
    JOIN (SELECT per_id, SUM(data_from_NT1) AS data_from_NT1, SUM(data_from_NT2) AS data_from_NT2 
      FROM newtable GROUP BY per_id 
     ) AS nt2 ON results.per_id = nt2.per_id 
GROUP BY name 
HAVING SUM(money) > 500; 

这是不完全清楚是否需要在主选择列表“和之和”;你可能不会。还不清楚namemoney列来自哪里;我通常会在它们前面添加适当的表别名。有了这些警告,这可能会更接近你所追求的:

SELECT name, SUM(money) AS MONEY, nt2.data_from_NT1, nt2.data_from_NT2 
    FROM transactions AS t 
    JOIN results  AS r ON t.id = r.id 
    JOIN more   AS m ON r.per_id = m.per_id 
    JOIN (SELECT per_id, SUM(data_from_NT1) AS data_from_NT1, SUM(data_from_NT2) AS data_from_NT2 
      FROM newtable GROUP BY per_id 
     ) AS nt2 ON results.per_id = nt2.per_id 
GROUP BY name, nt2.data_from_NT1, nt2.data_from_NT2 
HAVING SUM(money) > 500; 

毫无疑问,有其他方法来写这个。主查询中的分组可能会更好地放入并行子查询中,在主查询中留下简单的直接连接。但是我们没有这些信息可以为你实现。

+0

你好,先生!当你说我不需要“总和”时,你是对的。我想问为什么从新表中返回的值增加了一倍/三倍,然后我注意到你的答案。太好了谢谢! – Alex 2012-04-08 07:45:06

1

您可以在group by移动到一个子查询。

相关问题