2012-01-07 4 views
1

Я пытаюсь сделать следующую работу запроса:группы по количеству()

SELECT 
    DATE_FORMAT(date, '%Y %m') AS `Month`, 
    COUNT(schedule_id) AS `Shifts`, 
    COUNT(user_id) AS `Users` 
FROM 
    schedule 
GROUP BY 
    `Month`, `Shifts` 

Он должен дать частотную таблицу о том, сколько пользователей работают определенное количество смен, в месяц (например, в декабре было 10 пользователей, работающих в 20 смен, 12 пользователей работали в 15 смен и т. д.).

MySQL не может группироваться в COUNT(), хотя запрос прерывается. Как я могу сделать эту работу?

ответ

2

Попробуйте это:

SELECT 
    `Month`, `Shifts`, COUNT(`User`) `Users` 
FROM ( 
    SELECT -- select nr of shifts per user 
     DATE_FORMAT(date, '%Y %m') AS `Month`, 
     user_id AS `User`, 
     COUNT(schedule_id) AS `Shifts` 
    FROM 
     schedule 
    GROUP BY 
     `Month`, `User` 
) s 
GROUP BY `Month`, `Shifts` 

Внутренний запрос возвращает месяц, пользователь и сдвиги сосчитать. Во внешнем запросе вы можете группировать по сменам.

+0

Thanx! Аккуратный трюк. – Lennart

1

Использование подзапросов, чтобы получить отсчеты на некоторое idetifier (Идентификатор столбца в примере), а затем объединить его с исходным запросом

SELECT ... FROM schedule sh JOIN (SELECT id, COUNT(schedule_id) AS Shifts FROM schedule) AS cnt ON cnt.id = sh.id GROUP BY ..., cnt.Shifts 
0
SELECT 
    y 
    , m 
    , Shifts 
    , COUNT(*) AS Users 
FROM 
    (SELECT 
     YEAR(date) AS y 
     , MONTH(date) AS m 
     , user_id 
     , COUNT(*) AS Shifts 
    FROM 
     schedule 
    GROUP BY 
     YEAR(date), MONTH(date), user_id 
) AS grp 
GROUP BY 
    y 
    , m 
    , Shifts