SQL:如何使用GROUP BY来获取聚合的聚合?

时间:2015-09-13 14:54:39

标签: mysql sql group-by

我有一个按(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

但这不起作用("无效使用群组功能")。有没有办法可以做到这一点,而无需进行子选择?

1 个答案:

答案 0 :(得分:1)

伊万,

你问过"有没有办法我可以做到这一点,而不必做一个子选择" ...有没有理由你不能再选择?

不幸的是,您需要使用子选择,因为您无法组合聚合函数(这是您能够完成此任务的唯一方法)。请参阅:How to combine aggregate functions in MySQL?

正如其他答案所示,您必须使用子查询。