2013-02-18 6 views
2

Я не могу понять запрос MySQL, чтобы извлечь данные, которые я хочу из этой таблицы «timeEntry»:SQL Multiple GROUP BY

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; 

Но не получилось ...

Спасибо заранее.

+0

пожалуйста, вы можете предоставить схему на http://sqlfiddle.com –

+0

не Вы действительно хотите нет данных в суб строки? Например, для вашей второй и третьей строк было бы хорошо, если бы они имели значение '1' для' clientId'? –

+0

@Abe Miessler: да, все будет в порядке. –

ответ

1

Куда нужно ехать перед Группой.

Если вы хотите отфильтровать по дате перед группировкой, используйте предложение where, которое у вас есть, но перемещено перед группой.

Если бы вместо этого хотел, чтобы отфильтровать целые группы в или, используйте имеющие:

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

Спасибо за ответ, теперь он работает. –

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

Вы можете использовать [with Rollup][1] для создания суб-aggregrates. если вы хотите

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