Ich frage mich, wie ich diese Abfrage schreiben soll.
Ich weiß, dass diese tatsächliche Syntax falsch ist, aber sie wird Ihnen helfen zu verstehen, was ich will. Ich brauche es in diesem Format, weil es Teil einer viel größeren Abfrage ist.
SELECT distributor_id,
COUNT(*) AS TOTAL,
COUNT(*) WHERE level = 'exec',
COUNT(*) WHERE level = 'personal'
Ich brauche dies alles in einer Abfrage zurückgegeben.
Außerdem muss es sich in einer Zeile befinden, damit Folgendes nicht funktioniert:
'SELECT distributor_id, COUNT(*)
GROUP BY distributor_id'
SELECT distributor_id, COUNT(*) AS TOTAL, COUNT(*) WHERE level = 'exec', COUNT(*) WHERE level = 'personal'
Antworten:
Sie können eine
CASE
Anweisung mit einer Aggregatfunktion verwenden. Dies ist im Grunde dasselbe wie einePIVOT
Funktion in einigen RDBMS:quelle
COUNT
zähltdistributor_id
weise. Nicht alle Zeilen der Tabelle, oder?Ein Weg, der sicher funktioniert
EDIT:
Siehe @ KevinBalmforth die Aufschlüsselung der Leistung dafür , warum Sie wahrscheinlich nicht wollen , diese Methode verwenden und stattdessen für @ Taryn ♦ entscheiden sollten 's Antwort. Ich lasse das hier, damit die Leute ihre Optionen verstehen können.
quelle
sum(case...)
sollte eine Lösung in Betracht gezogen werden.group by
verschachtelte Abfrage durch eine einfache Abfrage ersetzen können,count(*)
wie @Mihai zeigt - mit weiteren Vereinfachungen der MySQL-Syntax.COUNT
zählt nurnon null
Werte undDECODE
gibt1
nur dann einen Wert ungleich Null zurück, wenn Ihre Bedingung erfüllt ist.quelle
distributor_id
wird die Abfrage zeigen? Es zeigt insgesamt 1 Zeile.Aufbauend auf anderen geposteten Antworten.
Beide ergeben die richtigen Werte:
Die Leistung ist jedoch sehr unterschiedlich, was offensichtlich mit zunehmender Datenmenge relevanter wird.
Ich stellte fest, dass unter der Annahme, dass keine Indizes für die Tabelle definiert wurden, die Abfrage mit den SUMs einen einzelnen Tabellenscan durchführen würde, während die Abfrage mit den COUNTs mehrere Tabellenscans durchführen würde.
Führen Sie als Beispiel das folgende Skript aus:
Markieren Sie die 2 SELECT-Anweisungen und klicken Sie auf das Symbol "Geschätzten Ausführungsplan anzeigen". Sie werden sehen, dass die erste Anweisung einen Tabellenscan und die zweite 4 ausführt. Offensichtlich ist ein Tabellenscan besser als 4.
Interessant ist auch das Hinzufügen eines Clustered-Index. Z.B
Das erste SELECT oben führt einen einzelnen Clustered Index Scan durch. Das zweite SELECT führt 4 Clustered Index-Suchvorgänge durch, die jedoch immer noch teurer sind als ein einzelner Clustered Index-Scan. Ich habe dasselbe an einem Tisch mit 8 Millionen Zeilen versucht und das zweite SELECT war immer noch viel teurer.
quelle
Für MySQL kann dies verkürzt werden auf:
quelle
Wenn Sie alles in einer Abfrage haben müssen, können Sie eine Union bilden:
Oder wenn Sie nach der Verarbeitung tun können:
Sie erhalten die Anzahl für jedes Level und müssen sie alle zusammenfassen, um die Summe zu erhalten.
quelle
UNION
sich als sehr hilfreich erwiesen, wenn ein Bericht erstellt wird, der mehrere Instanzen derCOUNT(*)
Funktion enthält.#1064 - You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near ') FROM distributors UNION SELECT COUNT() AS EXEC_COUNT FROM distributors WHERE ' at line 1
.Ich mache so etwas, indem ich jeder Tabelle einen String-Namen gebe, um sie in Spalte A zu identifizieren, und eine Anzahl für die Spalte. Dann vereinige ich sie alle, damit sie sich stapeln. Das Ergebnis ist meiner Meinung nach ziemlich gut - ich bin mir nicht sicher, wie effizient es im Vergleich zu anderen Optionen ist, aber es hat mir das gebracht, was ich brauchte.
Ergebnis:
quelle
a query that I created makes ...
- Wo ist diese Abfrage?Basierend auf der von Bluefeet akzeptierten Antwort mit einer zusätzlichen Nuance unter Verwendung von
OVER()
:Wenn Sie
OVER()
nichts in () verwenden, erhalten Sie die Gesamtzahl für den gesamten Datensatz.quelle
Ich denke, das kann auch bei Ihnen funktionieren
select count(*) as anc,(select count(*) from Patient where sex='F')as patientF,(select count(*) from Patient where sex='M') as patientM from anc
Außerdem können Sie verwandte Tabellen wie diese auswählen und zählen
select count(*) as anc,(select count(*) from Patient where Patient.Id=anc.PatientId)as patientF,(select count(*) from Patient where sex='M') as patientM from anc
quelle