SQL多个GROUP BY

时间:2013-02-18 20:16:32

标签: mysql sql

我无法弄清楚mysql查询从这个表“ timeEntry ”中提取我想要的数据:

hours     creationDate    userId    clientId    projectId    taskId
20        2012-02-18      1         1           1            1
40        2012-02-18      1         1           1            1
30        2012-02-21      2         1           1            1
20        2012-02-22      2         1           1            2
30        2012-02-22      2         1           1            2
80        2012-02-23      1         2           2            2
10        2012-02-23      3         2           2            2
15        2012-02-23      1         2           2            3
40        2012-02-23      1         2           4            1

我希望将这种结果作为另一个表,或csv / excel文件或php数组(其中totalHours是userId的小时数之和)给定时间段,比方说(2012年之间) -02-01和2012-02-25):

clientId    projectId    taskId    userId    totalHours
1           1            1         1         60
                                   2         30
                         2         2         50 
2           2            2         1         80 
                                   3         10
                         3         1         15
            4            1         1         40

我想我必须使用多个组,我尝试了类似的事情:

SELECT clientId, projectId, taskId, userId, sum(hours)
FROM `timeEntry`
WHERE date_creation >= "2012-02-01"
AND date_creation <= "2012-02-25"
GROUP BY  clientId, projectId, taskId, userId;

但是没有用......

提前致谢。

3 个答案:

答案 0 :(得分:1)

在分组之前需要去的地方。

如果您想在分组前按日期过滤,请使用您拥有的但在分组前移动的where子句。

如果您想要输入或输出整个组,请使用:

...
Group by ...
Having max(date) <= someValue and min(date) >= someValue

答案 1 :(得分:0)

SELECT clientId, projectId, taskId, userId    sum(Hours) total_hours 
FROM timeEntry 
GROUP BY clientID, ProjectID, TaskID, userID;

您可以使用[with Rollup][1]生成子聚合。如果你想要

答案 2 :(得分:0)

这是一个简单的解决方案。您需要按所有必填字段进行分组

SELECT
  t.clientId,
  t.projectId,
  t.taskId,
  t.userId,
  SUM(t.hours) AS Total
FROM test AS t
GROUP BY t.creationDate , t.userId , t.clientId , t.projectId , t.taskId

Fiddle Demo

输出:

clientId    projectId   taskId  userId   Total
____________________________________________________________

    1           1           1       1       60
    1           1           1       2       30
    1           1           2       2       50
    2           2           2       1       80
    2           2           3       1       15
    2           4           1       1       40
    2           2           2       3       10