Подтвердить что ты не робот

MySQL и CASE WHEN с рядом значений

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

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

Etc.

Я использую следующий запрос, но я не могу заставить его группировать "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
4b9b3361

Ответ 1

попробуйте следующее:

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... Оно определяет критерии, по которым каждая строка в базовых таблицах будет анализировать, чтобы определить, какой "ведро" он будет агрегирован в данные... Выражение или выражения, определенные в предложении group by, являются "определениями" для этих ковшей.

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

Ответ 2

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

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;