2010-05-26 8 views
21

Ich habe eine Konten-Tabelle und eine Tabelle Datensätze, wo Konten mehrere Datensätze haben. Ich möchte die Kontosummen nach "Anzahl der Datensätze" aufteilen. I.e. Zeigen Sie den Abbau vonMySQL und CASE WHEN mit einem Bereich von Werten

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

Etc.

ich die folgenden Abfrage verwenden, aber ich kann es nicht durch „grp“ zu einer Gruppe erhalten, die ist, was ich will, jede Hilfe auf dem besten Weg zu Abfrage ändern?

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 

Antwort

19

versuchen Sie dies:

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

Sie müssen „definieren“, um die „Eimer“, um die ursprünglichen Datenzeilen in aggregieren wollen ... Das ist, was die Gruppe von Klausel ist .. Es definiert die Kriterien, nach denen jede Zeile in den Basistabellen analysiert wird, um zu bestimmen, in welchem ​​"Bucket" die Daten aggregiert werden sollen ... Der Ausdruck oder die Ausdrücke, die in der group by-Klausel definiert sind, sind die "Definitionen" für diese Buckets.

Während die Abfrage die ursprünglichen Datenzeilen verarbeitet, wird jede Zeile, für die der/die Wert (e) dieses Ausdrucks identisch mit einem vorhandenen Bucket sind, in diesem Bucket zusammengefasst ... Jede neue Zeile mit einem Wert nicht dargestellt durch einen vorhandenen Bucket verursacht einen neuen Bucket erstellt werden ...

+2

ich ERROR 1111 (HY000): Ungültige Verwendung von Gruppenfunktion ich MySQL 5.1 Dank bin mit! – kickdaddy

+0

Entschuldigung, da Sie die Spalten 'r.Account_id' und' a.id' im Hauptteil der SQL-Abfrage verwenden, müssen Sie diese auch in die Gruppierung nach einfügen. Jede Spalte oder jeder Ausdruck verweist auf t9o Im Hauptabschnitt (Voraggregation) der Abfrage, der keine Aggregationsfunktion ist (Summe, Durchschnitt, Min, Max usw.), muss in der Gruppierung nach-Klausel erwähnt werden. –

+0

Ich sehe nicht, wie Sie ein COUNT (*) innerhalb einer GROUP BY-Klausel verwenden können. Ist das überhaupt möglich? –

6

Sie benötigen eine Unterabfrage. Wenn dies eine Ansicht ist, müssen Sie dann zwei Ansichten verwenden.

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;