484 Stimmen

Wie kann ich mehrere Zählungen mit einer SQL-Abfrage erhalten?

Ich frage mich, wie ich diese Anfrage schreiben soll.

Ich weiß, dass diese eigentliche Syntax falsch ist, aber sie wird Ihnen helfen zu verstehen, was ich will.

Ich brauche sie in diesem Format, weil sie 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.

Außerdem muss es in einer Zeile stehen, so dass das Folgende nicht funktionieren wird:

'SELECT distributor_id, COUNT(*)
GROUP BY distributor_id'

11voto

CrazyCasta Punkte 24580

Wenn Sie alles in einer Abfrage haben müssen, können Sie eine Vereinigung durchführen:

SELECT distributor_id, COUNT() FROM ... UNION
SELECT COUNT() AS EXEC_COUNT FROM ... WHERE level = 'exec' UNION
SELECT COUNT(*) AS PERSONAL_COUNT FROM ... WHERE level = 'personal';

Oder wenn Sie nach der Verarbeitung tun können:

SELECT distributor_id, COUNT(*) FROM ... GROUP BY level;

Sie erhalten die Anzahl für jedes Level und müssen diese zusammenzählen, um die Gesamtzahl zu erhalten.

8voto

Frantumn Punkte 1635

Ich mache es so, dass ich jeder Tabelle einen Stringnamen gebe, um sie in Spalte A zu identifizieren, und eine Anzahl für die Spalte. Dann vereinige ich sie alle, damit sie gestapelt werden. Das Ergebnis ist meiner Meinung nach hübsch - nicht sicher, wie effizient es ist im Vergleich zu anderen Optionen, aber es hat mich, was ich brauchte.

select 'table1', count (*) from table1
union select 'table2', count (*) from table2
union select 'table3', count (*) from table3
union select 'table4', count (*) from table4
union select 'table5', count (*) from table5
union select 'table6', count (*) from table6
union select 'table7', count (*) from table7;

Ergebnis:

-------------------
| String  | Count |
-------------------
| table1  | 123   |
| table2  | 234   |
| table3  | 345   |
| table4  | 456   |
| table5  | 567   |
-------------------

7voto

mentorrory Punkte 71

Basierend auf Taryns Antwort mit einer zusätzlichen Nuance durch OVER() :

SELECT distributor_id,
    COUNT(*) total,
    SUM(case when level = 'exec' then 1 else 0 end) OVER() ExecCount,
    SUM(case when level = 'personal' then 1 else 0 end) OVER () PersonalCount
FROM yourtable
GROUP BY distributor_id

Verwendung von OVER() mit nichts in der () ergibt die Gesamtzahl für den gesamten Datensatz.

2voto

Stevoisiak Punkte 19768

Wenn Ihre SQL-Variante dies unterstützt, können Sie COUNT_IF() um auf der Grundlage einer Bedingung zu zählen.

SELECT
    distributor_id, 
    COUNT(*) AS total_count, 
    COUNT_IF(level = 'exec') AS exec_count, 
    COUNT_IF(level = 'personal') AS personal_count
FROM table_name
GROUP BY distributor_id

1voto

Sinte Punkte 91

Ich denke, das kann auch für Sie 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

und Sie können auch verwandte Tabellen wie folgt 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

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X