【问题标题】:How to do two MySQL SUMs based on different criterias如何根据不同的标准做两个 MySQL SUM
【发布时间】:2015-03-01 14:38:24
【问题描述】:

我有 6 个相互关联的表。我有一个收集所有数据的 JOIN 查询。我首先提供 cpv_id 作为来自用户的变量,然后最后我需要获取与该 cpv_id 相关的每个公司的报告(通过它们之间的许多表)。

基本上,流程是这样的:

我从用户那里得到 cpv_id,我在 club_offer_cpv 表中找到它,我得到 club_offer_id,所以我可以连接到 club_offer 表。然后在 club_offer 表中我得到 club_id 以便我可以连接到 club 表。然后在 club 表中我得到 users_id 以便我可以连接到 users 表。然后在 users 表中我得到 company_id 以便我可以连接到 company 表。在 company 表中,我得到 special_id,因此我可以连接到最后一个表 company_reports。这是我需要从中获取数据的地方。我需要这个:

这里我有 3 个感兴趣的领域:report_yearvariable_codevariable_value

report_year 存储制作公司报告的年份。
variable_code 存储制作的报告类型。在我关于 SQL Fiddle 的简化示例中,可能的值为 AOP 605AOP 201
variable_value 存储每个 variable_code 的值。例如对于 AOP 605 代码,会有 5 的值。

我的麻烦来了:我需要为属于某个 cpv_id 组的所有公司的每个 variable_code 求和 variable_value(来自用户请求)。我只设法创建了一个查询,它将对一个代码的值求和。您可以在提供的 SQL Fiddle 中看到:http://sqlfiddle.com/#!2/a3e296/2

在输出中,您将看到我正在为代码 AOP 201 执行总和,在我的应用程序中,我正在执行另一个查询来计算 AOP 605 的总和,但我认为这并不理想,并且可能有一些方法可以在同一查询中同时获取 AOP 201AOP 605 的 SUM。然后我可以调用它们 sum201 和 sum605 并将它们都显示在我的应用程序中。有人可以告诉我这是否可能吗?你能告诉我查询将收集 AOP 201AOP 605 的总和并将它们存储在单独的值中,以便我可以显示 AOP 201的总和> 和 AOP 605 的总和 ???

还有一个更棘手的部分。正如您在我的查询中看到的那样,我遇到了这种情况:AND company_report.report_year = 2013。这并不理想,因为有些公司没有 2013 年的报告,其中一些只有 2012 年的报告。我将不得不采用他们拥有的最后一年的报告。因此,例如,如果某些公司在 2012 年和 2013 年有报告,我将仅计算 2013 年。同样,如果其他公司有 2009 年和 2012 年的报告,我只会计算 2012 年。

你能帮我解决这个问题吗?

我现在为此苦苦挣扎了 3 天,但找不到解决方案。感谢您的宝贵时间。

编辑:我需要 AOP 605AOP 201 的总和作为单独的列,因此我可以在我的应用程序代码中访问它们,例如 $sumOne - 显示 AOP 605 的总和strong>AOP 605 和 $sumTwo - 显示 AOP 201 的总和。

更多信息:我正在尝试将这两个查询合并为一个:

SELECT DISTINCT company_report.*, floor(sum(variable_value)) as totalSum
                                         FROM company_report
                                         JOIN company        ON company_report.special_id = company.special_id 
                                         JOIN users          ON company.id = users.company_id 
                                         JOIN club           ON users.id = club.users_id
                                         JOIN club_offer     ON club.id = club_offer.club_id
                                         JOIN club_offer_cpv ON club_offer.id = club_offer_id 
                                                             AND club_offer_cpv.cpv_id LIKE '66%'
                                                             AND company_report.variable_code = 'AOP 201'
                                                             AND company_report.report_year = 2013

SELECT DISTINCT company_report.*, floor(sum(variable_value)) as totalSum
                                         FROM company_report
                                         JOIN company        ON company_report.special_id = company.special_id 
                                         JOIN users          ON company.id = users.company_id 
                                         JOIN club           ON users.id = club.users_id
                                         JOIN club_offer     ON club.id = club_offer.club_id
                                         JOIN club_offer_cpv ON club_offer.id = club_offer_id 
                                                             AND club_offer_cpv.cpv_id LIKE '66%'
                                                             AND company_report.variable_code = 'AOP 605'
                                                             AND company_report.report_year = 2013

请注意每个查询中的这些行:

company_report.variable_code = 'AOP 605'

company_report.variable_code = 'AOP 201'

所以在一个查询中,我想获得 variable_code = "AOP 605" 的行的 variable_value 总和,第二个查询我需要获得 variable_code = "AOP 201" 的行的 variable_value 总和。但我认为必须有某种方法可以在一个查询中获得两个总和,但在我可以单独显示它们的方式上,例如:

AOP 605 的总和是:123
AOP 201 的总和是:345

【问题讨论】:

  • 对于您的第一个问题,您可以在 variable_codeIN 上应用 group by 以获得加入条件。这是 sql fiddle sqlfiddle.com/#!2/a3e296/12
  • 谢谢!但是如何访问 AOP 605 的 sum 以及如何访问 AOP 201 ?难道不应该有一个新字段,比如 sum1 具有 AOP 605 的总和,而 sum2 具有 AOP 201 的总和吗?
  • 当前查询为您提供每个 variabl_code 的每一行,但如果您想要该列,则可以在查询中应用 CASE WHEN variablecode then sum 表达式。
  • 你能把它摆弄一下吗?谢谢!

标签: php mysql sql database sum


【解决方案1】:

您似乎正在寻找的是 SELECT 的 GROUP BY 部分,如下所示:

SELECT DISTINCT company_report.*, floor(sum(variable_value)) as totalSum
FROM company_report
JOIN company        ON company_report.special_id = company.special_id 
JOIN users          ON company.id = users.company_id 
JOIN club           ON users.id = club.users_id
JOIN club_offer     ON club.id = club_offer.club_id
JOIN club_offer_cpv ON club_offer.id = club_offer_id 
                    AND club_offer_cpv.cpv_id LIKE '66%' 
                    AND company_report.variable_code IN ('AOP 201','AOP 605')
                    AND company_report.report_year = 2013
GROUP BY company_report.variable_code                    

是吗?

【讨论】:

  • 不幸的是它不是:(。我在帖子末尾添加了更多信息。
  • 你不告诉我为什么?我的回答确实产生了你的两个单独的 SQL 命令所做的事情。我在你的 sqlfiddle 中试过了。在这种情况下,您在帖子末尾添加的内容没有意义。所以请解释为什么你认为这不是你要找的。​​span>
  • 我无法在我的应用程序中输出:AOP 605 的总和是:123 AOP 201 的总和是:345。variable_codes 不仅仅是 AOP 605 和 AOP 201,但我不希望它们在输出。只需要这两个的总和,我需要它们作为列返回。我上面说过,我为每个感兴趣的 AOP 做了两个查询返回总和,现在我想将它们合并为一个以提高性能。
  • 啊,我明白了。好吧,只需选择您的两个 variable_codes。我不知道为什么他们应该在一个单独的列中。我不认为这是有用的或容易做到的。我会修改我的答案。
  • 也许我不需要它们作为列,如果我可以获取返回的值并向它们中的每一个添加自定义文本以获得:AOP 605 的总和是:123(新行)AOP 201 的总和是: 345
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2022-10-23
  • 2023-02-11
  • 2017-06-09
  • 1970-01-01
  • 1970-01-01
  • 2014-03-08
  • 1970-01-01
相关资源
最近更新 更多