danius: Mehrere COUNT() in einer einzigen SQL-Abfrage

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)

  1. 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

    1. Leider frage ich nur 1 Tabelle ab... ?

      1. 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

        1. 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