2010-05-26 3 views
21

У меня есть таблица учетных записей и таблица записей, в которой учетные записи имеют несколько записей. Я хотел бы разбить итоговые суммы счетов по диапазону «количество записей». То есть Показать разбивкуMySQL и CASE WHEN с диапазоном значений

Count of Records | Count 
========================= 
0-25 | 100 
25 - 50 | 122 
50 - 100 | 300 

И т.д.

Я использую следующий запрос, но я не могу получить его в группу «GRP», которая является то, что я хочу, любой помощь на лучшем пути к изменить запрос?

SELECT count(*) as ct, 
    CASE 
     WHEN COUNT(*) < 25 THEN '1-25' 
     WHEN COUNT(*) >= 25 < 50 THEN '25-50' 
     WHEN COUNT(*) >= 50 < 100 THEN '50-100' 
     WHEN COUNT(*) >= 100 < 250 THEN '100-250' 
     WHEN COUNT(*) >= 250 < 500 THEN '250-500' 
     WHEN COUNT(*) >= 500 < 1000 THEN '500-1000' 
     ELSE '1000+' 
    END AS grp 
    FROM records r,accounts a 
    WHERE r.account_id=a.id 
    ORDER BY ct 

ответ

19

попробовать это:

SELECT count(*) as ct, 
CASE 
    WHEN COUNT(*) < 25 THEN '1-25' 
    WHEN COUNT(*) >= 25 < 50 THEN '25-50' 
    WHEN COUNT(*) >= 50 < 100 THEN '50-100' 
    WHEN COUNT(*) >= 100 < 250 THEN '100-250' 
    WHEN COUNT(*) >= 250 < 500 THEN '250-500' 
    WHEN COUNT(*) >= 500 < 1000 THEN '500-1000' 
    ELSE '1000+' 
END AS grp 
FROM records r, accounts a 
WHERE r.account_id=a.id 
GROUP BY r.account_id, a.id, 
    CASE 
    WHEN COUNT(*) < 25 THEN '1-25' 
    WHEN COUNT(*) >= 25 < 50 THEN '25-50' 
    WHEN COUNT(*) >= 50 < 100 THEN '50-100' 
    WHEN COUNT(*) >= 100 < 250 THEN '100-250' 
    WHEN COUNT(*) >= 250 < 500 THEN '250-500' 
    WHEN COUNT(*) >= 500 < 1000 THEN '500-1000' 
    ELSE '1000+' END 
ORDER BY count(*) 

Вы должны «определить» «ведра» вы хотите объединить исходные строки данных в ... Это то, что группа пунктом для .. . Он определяет критерии, по которым каждая строка в базовых таблицах будет проанализирована, чтобы определить, какие «ведра» будут сводиться к ее данным ... Выражение или выражения, определенные в предложении group by, являются «определениями» для этих ковшей.

Поскольку запрос обрабатывает исходные строки данных, любая строка, для которой значение (-ы) этого выражения (ов) совпадает с существующим ведром, агрегируется в это ведро ... Любая новая строка со значением не представленный существующим ковшом, вызывает создание нового ковша ...

+2

Я получаю ERROR 1111 (HY000): Недопустимое использование функции группы Я использую MySQL 5.1 Спасибо! – kickdaddy

+0

Извините, поскольку вы используете столбцы 'r.Account_id' и' a.id' в основной части SQL-запроса, вам нужно включить их в предложение group By ... Каждый столбец или выражение ссылаются на t9o в основной (предагрегационной) части запроса, которая не является функцией агрегации (Sum, Avg, Min, Max и т. д.), должна упоминаться в предложении group By. –

+0

Я не вижу, как вы можете использовать COUNT (*) внутри предложения GROUP BY. Возможно ли это? –

6

Вам нужен подзапрос. Если это представление, вам нужно использовать два представления.

SELECT s.ct, s.grp FROM ( 
SELECT count(*) as ct, 
    CASE 
     WHEN COUNT(*) < 25 THEN '1-25' 
     WHEN COUNT(*) >= 25 AND COUNT(*) < 50 THEN '25-50' 
     WHEN COUNT(*) >= 50 AND COUNT(*) < 100 THEN '50-100' 
     WHEN COUNT(*) >= 100 AND COUNT(*) < 250 THEN '100-250' 
     WHEN COUNT(*) >= 250 AND COUNT(*) < 500 THEN '250-500' 
     WHEN COUNT(*) >= 500 AND COUNT(*) < 1000 THEN '500-1000' 
     ELSE '1000+' 
    END AS grp 
    FROM records r,accounts a 
    WHERE r.account_id=a.id) as s 

Group BY s.grp; 
Смежные вопросы