我有一个按(column_a,column_b)分组的查询,并选择一个聚合值。我想按column_a进行分组,并获取先前聚合值的总和。
可能更清楚一个例子:
我们有3个表:项目,开发人员和贡献者。每个项目都有许多贡献者,每个开发人员都是许多项目的贡献者:
+======== projects =========+ +====== devs =======+
+--------------+------------+ +--------+----------+
| project_name | project_id | | dev_id | dev_name |
+--------------+------------+ +--------+----------+
| parsalot | 1 | | 1 | Ally |
| vimplug | 2 | | 2 | Ben |
| gamify | 3 | | 3 | Chris |
+--------------+------------+ +--------+----------+
+==== contributors ===+
+------------+--------+
| project_id | dev_id |
+------------+--------+
| 1 | 2 |
| 1 | 3 |
| 2 | 1 |
| 2 | 2 |
| 3 | 3 |
+------------+--------+
我对每个项目的工作量感兴趣。我可以算一下每个贡献者的数量,但我想更加重视开发者所做的贡献,他们并没有将时间分配给许多其他项目。
所以vimplug比parsalot更积极地开发:每个项目都有两个贡献者,但vimplug的一个(Ally)什么也没做,而parsalot的贡献者都把时间分配给其他项目。 / p>
我构建了一个按(项目,贡献者)分组的查询,并计算每个贡献者"奉献"到项目:
SELECT
projects.project_name,
devs.dev_name,
1 / COUNT(contributions.project_id) as dedication
FROM
projects
JOIN
contributors USING (project_id)
JOIN
devs USING (dev_id)
JOIN
contributors contributions USING (dev_id)
GROUP BY projects.project_id , contributors.dev_id;
哪个收益率,
+--------------+----------+------------+
| project_name | dev_name | dedication |
+--------------+----------+------------+
| parsalot | Ben | 0.5000 |
| parsalot | Chris | 0.5000 |
| vimplug | Ally | 1.0000 |
| vimplug | Ben | 0.5000 |
| gamify | Chris | 0.5000 |
+--------------+----------+------------+
但我真正想要的是每个项目的全部奉献精神,即
+--------------+------------------+
| project_name | total_dedication |
+--------------+------------------+
| gamify | 0.5000 |
| parsalot | 1.0000 |
| vimplug | 1.5000 |
+--------------+------------------+
我(天真地)尝试将我的select语句更改为
SELECT
projects.project_name,
SUM(1 / COUNT(contributions.project_id)) as total_dedication
但这不起作用("无效使用群组功能")。有没有办法可以做到这一点,而无需进行子选择?
答案 0 :(得分:1)
伊万,
你问过"有没有办法我可以做到这一点,而不必做一个子选择" ...有没有理由你不能再选择?
不幸的是,您需要使用子选择,因为您无法组合聚合函数(这是您能够完成此任务的唯一方法)。请参阅:How to combine aggregate functions in MySQL?
正如其他答案所示,您必须使用子查询。