Count() auf bei 0 anzeigen

Einklappen
X
 
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • Count() auf bei 0 anzeigen

    Hallo Leute,

    Folgende Abfrage:
    Code:
    SELECT 
     groupname, errorname, COUNT(ticketid) AS anzahl 
    FROM 
     ticketgroup 
    INNER JOIN 
     fehlerquelle 
    LEFT JOIN tickets ON fk_errorid=errorid AND fk_groupid=groupid 
    GROUP BY 
     errorid, groupid 
    ORDER BY 
     groupname, errorname
    Es gibt 5 Gruppen und 5 Errors. Solange ich den Teil ab LEFT JOIN nicht anhänge, erhalte ich 25 Ergebnisse. Sobald ich aber das verknüpfe mit der Tabelle tickets, habe ich nur noch die Einträge, deren Anzahl > 0 ist.

    Wie kriege ich es nun hin, dass mir auch jene angezeigt werden, deren Anzahl 0 ist (und die damit in der Tabelle rechts nicht vorhanden sind)?

    Danke für die Hilfe
    andreas

  • #2
    Du darfst nur auf Spalten gruppieren, die nicht per LEFT JOIN angebunden werden - also jeweils die fk-Spalten verwenden. Hilft das?
    Die Zeit hat ihre Kinder längst gefressen

    Kommentar


    • #3
      also irgendwie ist das komisch. Weil der Code hier funktioniert:

      Code:
      SELECT 
       groupname, errorname, COUNT(ticketid) AS anzahl 
      FROM 
       ticketgroup 
      INNER JOIN 
       fehlerquelle 
      LEFT JOIN 
       tickets ON fk_errorid=errorid AND fk_groupid=groupid 
      GROUP BY 
       errorid, groupid 
      ORDER BY 
       groupname, errorname
      Dieser Code gibt mir auch jene aus, deren Anzahl 0 ist.

      sobald ich nun aber ein WHERE einbaue

      Code:
      SELECT 
       groupname, errorname, COUNT(ticketid) AS anzahl 
      FROM 
       ticketgroup 
      INNER JOIN 
       fehlerquelle 
      LEFT JOIN 
       tickets ON fk_errorid=errorid AND fk_groupid=groupid 
      WHERE 
       state=100 
      GROUP BY 
       errorid, groupid 
      ORDER BY 
       groupname, errorname
      hab ich nicht mehr alle Einträge...

      Weil das Problem ist ja, dass zwar alle angezeigt werden sollen, aber nur jene zu der Anzahl hinzugezählt werden sollen, deren state = 100 ist (und die dann auch noch im gewünschten Datumsbereich liegen)


      Danke für die Hilfe
      andreas
      Zuletzt geändert von fun2life; 06.07.2006, 15:57.

      Kommentar


      • #4
        OUTER JOIN?

        Kommentar


        • #5
          ne, geht nicht

          Code:
          SELECT 
           groupname, errorname, COUNT(ticketid) AS anzahl, state
          FROM 
           ticketgroup 
          INNER JOIN 
           fehlerquelle 
          LEFT OUTER JOIN 
           tickets ON fk_errorid=errorid AND fk_groupid=groupid 
          GROUP BY 
           fk_errorid, fk_groupid 
          HAVING
           state=100
          ORDER BY 
           groupname, errorname
          Auch mit HAVING statt WHERE nicht und mit LEFT OUTER JOIN nicht und mit RIGHT OUTER JOIN nicht und irgendwie immer nicht.

          Gestern hab ich eh den falschen Code gepostet, den mit der Gruppierung auf die errorid, groupid, statt auf fk_errorid, fk_groupid

          Kommentar


          • #6
            WHERE state = 100 OR state IS NULL?
            Ich denke, also bin ich. - Einige sind trotzdem...

            Kommentar


            • #7
              geht eben auch nicht - auch nicht im HAVING...

              Ich denke das Problem liegt in meinen Überlegungen und der Code damit ganz falsch.

              Weil ich möchte ja eigentlich alle Kategorien haben und dazu die Anzahl abgeschlossener Tickets (state=100).
              Irgendwo scheinen meine Überlegungen einfach nicht auf zu gehen beim gruppieren oder so, dass da nur die gezählt werden, deren status auch auf 100 ist, aber alle anderen doch angezeigt werden.

              Oder muss ich das sonst mit irgendwelchen verschachtelten Abfragen lösen?
              Zuletzt geändert von fun2life; 07.07.2006, 11:17.

              Kommentar


              • #8
                Code:
                SELECT 
                	groupname, errorname, 
                	SUM(IF(state=100, 1, 0)) AS anzahl 
                FROM 
                 ticketgroup 
                LEFT JOIN 
                 fehlerquelle 
                LEFT JOIN 
                 tickets ON fk_errorid=errorid AND fk_groupid=groupid 
                GROUP BY 
                 errorid, groupid 
                ORDER BY 
                 groupname, errorname
                So?

                Wie hängen die drei Tabellen denn zusammen?
                Welche Tabelle ist denn in der Abfrage mit welcher verknüpft?
                Ich denke, also bin ich. - Einige sind trotzdem...

                Kommentar


                • #9
                  Code:
                  SELECT
                   groupname, errorname, 
                   SUM(IF(state=100, 1, 0)) AS anzahl 
                  FROM 
                   ticketgroup 
                  INNER JOIN 
                   fehlerquelle 
                  LEFT JOIN 
                   tickets ON fk_errorid=errorid AND fk_groupid=groupid 
                  GROUP BY 
                   errorid, groupid 
                  ORDER BY
                   groupname, errorname
                  volltreffer

                  ich vermut mal, dass ich einfach state=100 AND ... verwenden kann, für weitere Einschränkungen.
                  Irgendwie muss ich das dann sowieso noch mit dem Datum verknüpfen und gruppieren, aber das muss ich mir mal noch überlegen, wie überhaupt.

                  Sonst meld ich mich dann wieder

                  Danke auf alle Fälle schonmal

                  Kommentar


                  • #10
                    Ich hab tatsächlich nochmals ein Problem mit dem Datum:
                    Code:
                    SELECT 
                     SUM(IF (state =100, 1, 0) ) AS anzahl, groupid, groupname, errorid, errorname, DATE_FORMAT( usetime, '%M %Y' ) AS zeitraum, DATE_FORMAT( usetime, '%Y%m' ) AS groupfield
                    FROM ticketgroup
                    INNER JOIN fehlerquelle
                    LEFT JOIN tickets ON fk_errorid = errorid
                    AND fk_groupid = groupid
                    GROUP BY groupfield, groupid, errorid
                    ORDER BY groupfield, groupname, errorname
                    Ich gruppiere das nun ja nach dem Zeitrahmen auch noch.
                    Und damit bin ich irgendwo wieder soweit, dass mir einige der Einträge rausfallen. Am einfachsten würde ich wohl einfach eine Tabelle erstellen, wo dann jeder gültige Monat drin steht, aber das ist ja irgendwie auch ein Witz...

                    Meine konkrete Frage deshalb: Wie kann ich das nun noch gruppieren, dass ich für den März 2006, für den April 2006, etc. jeweils alle Einträge erhalte?

                    Danke

                    Kommentar

                    Lädt...
                    X