使用SUM无法正常工作的3个表的SQL查询

时间:2016-06-23 16:23:23

标签: mysql sql

我有3张桌子

tbforecasts

creator [varchar] - date [date] - price [double] - status [int]

tbsector

sector [varchar] - user [varchar]

tbgoal

user [varchar] - goal [double] - month [int] - year [int]

我需要一个查询来对所选月份和年份的值进行求和,并按行分组,如下所示:

sector      sum(price)    sum(goal)<br/>
production  5000.00       30000.00<br/>
sales       42000.00      150000<br/> <br/>

我的实际查询并不总结目标的正确值......超过实际值...

  

SELECT s.sector,sum(m.goal),sum(f.price)AS price
  来自tbsector AS s   加入tbgoals AS m ON m.user = s.user
  加入tbforecasts AS f ON f.creator = s.user
  在m.month = 6和m.year = 2016年   AND月(f.date)= 6和年(f.date)= 2016
  GROUP BY s.sector;

3 个答案:

答案 0 :(得分:0)

如果我理解正确,你需要 LEFT JOINS 而不是 JOINS

SELECT s.sector, sum(m.goal), sum(f.price) AS price 
FROM tbsector AS s 
LEFT JOIN tbgoals AS m ON m.user = s.user 
LEFT JOIN tbforecasts AS f ON f.creator = s.user 
WHERE m.month = 6 AND m.year = 2016 
AND month(f.date) = 6 AND year(f.date) = 2016 
GROUP BY s.sector; 

答案 1 :(得分:0)

他们需要单独求和,请记住,如果没有分组和总和,类似的查询会将每个tbgoals记录与每个tbforecasts记录匹配,基于相同的用户|创建者;所以,如果一个&#34;部门&#34;有2个目标和3个预测,你将得到(和总和)该部门的6个结果。

有很多方法可以解决这个问题,最常见的方法是:将一个总和放入一个子查询中,然后将其加入另一个表中以获取另一个总和;或者将两个sum放入单独的子查询中,然后将它们连接到公共表。

根据您迄今为止提供的信息,很明显哪个(如果有的话)最容易接受;数据如何相关(而不仅仅是它的结构)可能很重要。

我提到的第二种方法看起来像这样:

SELECT s.sector, totalGoals, totalPrices 
FROM tbsector AS s 
LEFT JOIN (SELECT user, sum(goal) AS totalGoals 
      FROM tbgoals 
      WHERE `month` = 6 AND `year` = 2016
      GROUP BY user
) AS m ON m.user = s.user 
LEFT JOIN (SELECT creator, sum(price) AS totalPrices 
      FROM tbforecasts 
      WHERE month(f.`date`) = 6 AND year(f.`date`) = 2016
) AS f ON f.creator = s.user      
GROUP BY s.sector;

我猜这是原始查询的WHERE条件中更合适的解决方案(注意我将它们移动到相关的子查询中)。

旁注:如果在设计过程中为时已晚,我建议将某些表的字段重命名为与MySQL关键字/保留字不同;例如:datemonthyear,技术上甚至是user(尽管通常不会造成太多问题)。

答案 2 :(得分:0)

我用以下代码修复它:


  

SELECT s.sector,sum(totalGoals),sum(totalPrices)
  来自tbsectores AS s   LEFT JOIN(选择用户,总和(目标)AS totalGoals
       来自tbgoals
       月份= 6年份= 2016年        GROUP BY用户
  )AS m ON m.user = s.user
  LEFT JOIN(选择创建者,总和(价格)AS&gt; totalPrices
       来自tbforecasts
       月份(日期)= 6年和年份(日期)= 2016年        GROUP BY创作者
  )AS f ON f.creator = s.user
  GROUP BY s.sector;