【问题标题】:SQL Query with 3 Tables using SUM not working使用 SUM 的 3 个表的 SQL 查询不起作用
【发布时间】:2016-10-26 02:31:53
【问题描述】:

我有 3 张桌子

tb预测

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

tbsector

扇区[varchar] - 用户[varchar]

tbgoal

用户[varchar] - 目标[double] - 月[int] - 年[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
FROM tbsector AS s
加入 tbgoals AS m ON m.user = s.user
JOIN tbforecasts AS f ON f.creator = s.user
其中 m.month = 6 AND m.year = 2016
AND 月份(f.date) = 6 AND 年份(f.date) = 2016
按部门分组;

【问题讨论】:

    标签: mysql sql


    【解决方案1】:

    如果我理解正确,您需要 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; 
    

    【讨论】:

    • 我试过左右连接,但不能解决问题,总和需要分开,我需要帮助:s
    【解决方案2】:

    它们需要单独求和,记住如果没有分组和求和,类似的查询将匹配每个tbgoals 记录和每个tbforecasts 记录,基于相同的用户|创建者;因此,如果“部门”有 2 个目标和 3 个预测,您将获得(并总结)该部门的 6 个结果。

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

    根据您目前提供的信息,尚不清楚哪个(如果有的话)最适合;因为数据的关联方式(而不仅仅是它的结构)很重要。

    我提到的第二种方法如下所示:

    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(尽管这通常不会引起太多问题)。

    【讨论】:

    • 如何分别求和? sintax怎么样?你能帮忙吗?
    • @RaphãoTorres 看到我的答案的补充
    【解决方案3】:

    我用下面的代码修复它:


    选择 s.sector, sum(totalGoals), sum(totalPrices)
    FROM tbsectores AS s
    LEFT JOIN (SELECT user, sum(goal) AS totalGoals
    来自 tbgoals
    WHERE 月 = 6 年 = 2016
    按用户分组
    ) AS m ON m.user = s.user
    LEFT JOIN (SELECT creator, sum(price) AS >totalPrices
    来自 tbforecasts
    WHERE 月(日期)= 6 和年(日期)= 2016
    按创建者分组
    ) AS f ON f.creator = s.user
    GROUP BY s.sector;

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-07-04
      • 2021-02-26
      • 2015-02-16
      • 2018-11-08
      • 2015-01-29
      • 2013-02-05
      • 1970-01-01
      相关资源
      最近更新 更多