2010-05-26 9 views
21

Mam tabelę kont i tabelę rekordów, w których konta mają wiele rekordów. Chciałbym podzielić sumy kont na zakres "liczby rekordów". To znaczy. Pokaż podziałMySQL i CASE WHEN z zakresem wartości

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

Etc.

używam następujące kwerendy, ale nie mogę zmusić go do grupy przez „GRP”, który jest to, co chcę, żadnej pomocy na najlepszej drodze do modyfikować zapytanie?

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 

Odpowiedz

19

spróbuj tego:

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(*) 

Trzeba "zdefiniować" the "wiadra" chcesz agregować oryginalnych wierszy danych do ... To co klauzuli GROUP BY jest .. Określa kryteria, według których analizowany będzie każdy wiersz w tabelach podstawowych w celu określenia, w którym "segmencie" jego dane zostaną zagregowane ... Wyrażenie lub wyrażenia zdefiniowane w klauzuli group by są "definicjami" dla tych segmentów.

Gdy zapytanie przetwarza oryginalne wiersze danych, każdy wiersz, dla którego wartości tego wyrażenia są takie same jak istniejący segment, jest zagregowany w tym segmencie ... Dowolny nowy wiersz o wartości nie reprezentowany przez istniejący zasobnik powoduje utworzenie nowego zasobnika ...

+2

uzyskać ERROR 1111 (HY000): Nieprawidłowe korzystanie z funkcji grupowej używam MySQL 5.1 Dzięki! – kickdaddy

+0

Przepraszamy, ponieważ używasz kolumn 'r.Account_id' i' a.id' w głównej części zapytania sql, musisz również uwzględnić te w klauzuli By jako ... Każda kolumna lub wyrażenie, o którym mowa t9o w głównej (preagregacyjnej) części zapytania, która nie jest funkcją agregującą (Sum, Avg, Min, Max, itd.) musi być wymieniona w klauzuli By. –

+0

Nie widzę sposobu użycia wartości COUNT (*) wewnątrz klauzuli GROUP BY. Czy to możliwe? –

6

Potrzebujesz pod-zapytania. Jeśli jest to widok, musisz wtedy użyć dwóch widoków.

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; 
Powiązane problemy