具有不同Group By的多个聚合

时间:2014-12-02 05:53:12

标签: mysql sql select group-by aggregate-functions

我有表User,Company,ParentCompany和table Goal。 每个公司都有ParentCompany,每个用户都在一个公司内。目标包括行动的数量,目标的类型,执行目标的用户以及执行的时间。

我想为每个用户,公司和parent_company计算每种目标类型的日期范围内的操作数。每家公司的行动数量等于居住在该公司的用户的行动总和。

在一些连接查询之后或多或少,我能够得到下面的表,其中列id是公司的id,parent_id是companyparent的id,num是id公司内所有用户的目标数。

id          parent_id            num
----------- -------------------- -----------------------
1           3                    1
2           1                    2
3           1                    1
4           2                    4

现在我想让它像下面这样:

id          parent_id            sum_id         sum_parent
----------- -------------------- -------------- -------------
1           3                    1              1
2           1                    2              3
3           1                    1              3
4           2                    4              4

我怎样才能使它有效?我可以用GROUP BY,

得到一个值(sum_id或sum_parent)
SELECT id,SUM(num) AS sum_id FROM tableA GROUP BY id

SELECT parent_id,SUM(num) AS sum_parent FROM tableA GROUP BY parent_id

但有没有办法只在一个查询中进行? tableA来自查询,内部有5个连接。

3 个答案:

答案 0 :(得分:0)

试试这个:

SELECT a.id, a.parent_id, a.sum_id, b.sum_parent
FROM (SELECT id, parent_id, SUM(num) sum_id FROM tableA a GROUP BY id) a 
INNER JOIN (SELECT parent_id, SUM(num) sum_parent FROM tableA a GROUP BY parent_id) b ON a.parent_id = b.parent_id

答案 1 :(得分:0)

试试这个:

SELECT
    t1.id, t1.parent_id, t1.sum_id, t2.sum_parent
FROM
    (SELECT id, parent_id, SUM(num) AS  sum_id FROM mytable GROUP BY id) t1 
    INNER JOIN 
    (SELECT parent_id, SUM(num) AS sum_parent FROM mytable GROUP BY parent_id) t2 
    ON t1.parent_id = t2.parent_id

答案 2 :(得分:0)

显然我想要的是WITH ROLLUP声明。 (http://dev.mysql.com/doc/refman/5.0/en/group-by-modifiers.html

使用

SELECT id,sum(num) FROM tableA GROUP BY parent_id, id WITH ROLLUP;

将导致

parent_id   id                  sum(num)
----------- -------------------- -------------- 
1           2                    2              
1           3                    1              
1           null                 3              
2           4                    4              
2           null                 4              
3           1                    2              
3           null                 2