如何根据不同的标准进行两个MySQL SUM


How to do two MySQL SUMs based on different criterias

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

基本上,这就是流程:

我从用户那里得到了cpv_id,我在club_offer_cpv表中找到了它,我得到了club_ofer_id,所以我可以连接到club_offer表格。然后在club_offer表中,我得到club_id,这样我就可以连接到club表格。然后在club表中,我得到users_id,这样我就可以连接到users表格。然后在用户表中,我得到company_id,这样我就可以连接到公司表格。在公司表中,我得到special_id,这样我就可以连接到最后一个表company_ports。这是我需要获取数据的地方。我需要这个:

这里我有三个感兴趣的领域: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执行totalSum,并且在我的应用程序中,我正在执行另一个查询来计算AOP605的sum,但我认为这并不理想,并且可能有某种方法可以在同一查询中获得aoP201aoP505OP 201AOP605的总和,并将它们存储在单独的值中,这样我就可以显示AOP 201的总和和AOP505

还有一个更棘手的部分。正如你在我的查询中看到的,我有这样的条件:AND company_report.report_year = 2013。这并不理想,因为有些公司不会在2013年发布报告,有些公司只在2012年发布报告。我不得不接受他们最后一年的报告。例如,如果一些公司有2012年和2013年的报告,我只会把2013年算在内。同样,如果其他公司有2009年和2012年的报告,我只会把2012年算在内。

你也能帮我吗?

我已经为此挣扎了3天,找不到解决方案。谢谢你抽出时间。

编辑:我需要AOP 605AOP 201的和作为seprate列,这样我就可以在我的应用程序代码中访问它们,比如$sumOne-显示AOP605,$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_vvalue的和。但我认为,一定有某种方法可以在一个查询中获得两个总和,但在我可以单独显示它们的方式上,比如:

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

您似乎在寻找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                    

就是这样吗?