Mehrere COUNT() in einer einzigen SQL-Abfrage
danius
- datenbank
Hallo,
wollte euch fragen, ob wer weiß ob man in einer einzigen SQL-Abfrage mehrere COUNT() einbauen kann?
Mein Fall wäre folgender:
In einer Tabelle befinden sich Datensätzen von Adressen, nun möchte ich die Gesamtanzahl der Datenzeilen zählen (funktioniert mit der SQL-Abfrage weiter unten), sowie die Anzahl wieoft Variable1 'TRUE' ist und wie oft Variable2 'TRUE' ist.
Ist das überhaupt möglich, oder mit ich dazu extra SQL-Abfragen anlegen?
SELECT
COUNT(*) AS kun_kp_count
FROM
kontaktperson LEFT OUTER JOIN adressen ON kontaktperson.a_id=adressen.a_id
WHERE
kl_id=<dtml-sqlvar k_id type=int>
;
(Das DTML bitte nicht beachten)
Hallo,
wollte euch fragen, ob wer weiß ob man in einer einzigen SQL-Abfrage mehrere COUNT() einbauen kann?
Ja, du musst ggf. für jeden count eine eigene Tabelle abfragen. Ich sende dir mal einen Codeschnippsel:
$q = "
#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
# KONTAKTWUENSCHE, KONTAKTBUCHUNGEN
#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
SELECT
per1.owner_id
#count(DISTINCT kon1.gruppen_id) kon_anz_grp
,COUNT(DISTINCT CONCAT( CAST(kon1.gruppen_id AS CHAR), '_',
CAST(kon1.aussteller_id AS CHAR))) kon_anz_grp
#count(DISTINCT kon2.gruppen_id) kon_gebu_grp
,COUNT(DISTINCT CONCAT( CAST(kon2.gruppen_id AS CHAR), '_',
CAST(kon2.aussteller_id AS CHAR))) kon_gebu_grp
#count(kon3.besucher_id) kon_anz_einzel
,COUNT(DISTINCT CONCAT( CAST(kon3.besucher_id AS CHAR), '_',
CAST(kon3.aussteller_id AS CHAR))) kon_anz_einzel
#count(DISTINCT kon4.besucher_id) kon_gebu_einzel
,COUNT(DISTINCT CONCAT( CAST(kon4.besucher_id AS CHAR), '_',
CAST(kon4.aussteller_id AS CHAR))) kon_gebu_einzel
FROM ".$db[0]['personen']." AS per1
# WUENSCHE VON BESUCHERGRUPPEN
LEFT JOIN ".$db[0]['kontakte']." AS kon1
ON kon1.aussteller_id=per1.id AND ( kon1.prio_1=1 OR kon1.prio_2=1 ) AND kon1.gruppen_id>0
# TERMINE VON BESUCHERGRUPPEN
LEFT JOIN ".$db[0]['kontakte']." AS kon2
ON kon2.id=kon1.id AND kon2.slot_nr>0
# WUENSCHE VON EINZELBESUCHERN
LEFT JOIN ".$db[0]['kontakte']." AS kon3
ON kon3.aussteller_id=per1.id AND ( kon3.prio_1=1 OR kon3.prio_2=1 ) AND kon3.gruppen_id=0
# TERMINE VON EINZELBESUCHERN
LEFT JOIN ".$db[0]['kontakte']." AS kon4
ON kon4.id=kon3.id AND kon4.slot_nr>0
WHERE per1.owner_id=".$owner_id." AND per1.adr_kz=1 AND per1.loe_kz=0
GROUP BY per1.owner_id
";
MfG Kalle
Leider frage ich nur 1 Tabelle ab... ?
Leider frage ich nur 1 Tabelle ab... ?
Diese Anweisung...
SELECT
kontaktperson.kp_inactive, adressen.a_inactive, COUNT(*)
FROM
kontaktperson LEFT OUTER JOIN adressen ON kontaktperson.a_id=adressen.a_id
WHERE
kl_id='20001'
GROUP BY
kontaktperson.kp_inactive, adressen.a_inactive
;
... erzeugt:
f;f;4
f;t;1
t;f;1
aber wie kann ich jetzt eine bestimmte Zeile ansprechen? Zum Beispiel die mit f;t; oder die Summen von der dritten Spalte (4,1,1)?
THX
Hallo,
wenn du eine Ergebnismenge nach bzw. auf Basis der Anwendung von Gruppierung und Aggregatsfunktionen einschränken willst, dann benutze HAVING mit dem Alias bzw. der wiederholten Aggregatsfunktion (nach GROUP BY). Ein WHERE filtert Datensätze für gewöhnlich vor der Anwendungen von Gruppierung und Aggregatsfunktionen.
Wenn du nur eine bestimmte Spalte ausgeben willst, dann gib nur diese für das (bzw. nach dem) SELECT an und keine weiteren Spalten.
Wenn du von 4,1,1 die Summe bilden willst, dann funktioniert das durchaus durch sogenannte Subqueries / Unterabfragen. Also z.b. SELECT ... FROM (SELECT ... FROM .... GROUP BY ...) AS Subquery
Desweiteren möchte ich dir empfehlen mit Aliasen für Spalten und im besonderen für Tabellen zu arbeiten. Bei Subqueries ist dies fast unabdingbar.
Grüsse, Frank