我有3张桌子
creator [varchar] - date [date] - price [double] - status [int]
sector [varchar] - user [varchar]
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;
答案 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关键字/保留字不同;例如:date
,month
,year
,技术上甚至是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;