繁体   English   中英

SQL:如何使用GROUP BY进行汇总?

[英]SQL: how can I use GROUP BY to take an aggregate of an aggregate?

我有一个查询,该查询按(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的贡献者都将时间分散在其他项目上。

我构建了一个按(项目,贡献者)分组的查询,并计算出每个贡献者对项目的“奉献”:

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 
    projects.project_name,
    SUM(1 / COUNT(contributions.project_id)) as total_dedication

但这不起作用(“无效使用组功能”)。 有没有一种方法可以执行此操作而不必进行子选择?

只需使用子查询:

select project_name, sum(dedication)
from (<your query here>) q
group by project_name;

您已接近解决方案,请使用以下方法:

SELECT project_name,sum(dedication) as total_dedication FROM (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) as A GROUP BY project_name

伊万,

您问“是否有一种方法可以执行此操作而不必进行子选择” ...是否有不能进行子选择的原因?

不幸的是,您将需要使用子选择,因为您无法组合聚合函数(这将是实现此目标的唯一方法)。 请参阅: 如何在MySQL中组合聚合函数?

因此,如其他答案所示,您将不得不使用子查询。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM