【发布时间】: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_year、variable_code 和 variable_value。
report_year 存储制作公司报告的年份。
variable_code 存储制作的报告类型。在我关于 SQL Fiddle 的简化示例中,可能的值为 AOP 605 和 AOP 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 201 和 AOP 605 的 SUM。然后我可以调用它们 sum201 和 sum605 并将它们都显示在我的应用程序中。有人可以告诉我这是否可能吗?你能告诉我查询将收集 AOP 201 和 AOP 605 的总和并将它们存储在单独的值中,以便我可以显示 AOP 201的总和> 和 AOP 605 的总和 ???
还有一个更棘手的部分。正如您在我的查询中看到的那样,我遇到了这种情况:AND company_report.report_year = 2013。这并不理想,因为有些公司没有 2013 年的报告,其中一些只有 2012 年的报告。我将不得不采用他们拥有的最后一年的报告。因此,例如,如果某些公司在 2012 年和 2013 年有报告,我将仅计算 2013 年。同样,如果其他公司有 2009 年和 2012 年的报告,我只会计算 2012 年。
你能帮我解决这个问题吗?
我现在为此苦苦挣扎了 3 天,但找不到解决方案。感谢您的宝贵时间。
编辑:我需要 AOP 605 和 AOP 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_code和IN上应用 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