none
Abfangen von SQL count = empty RRS feed

  • Frage

  • Hallo.

    Ich suche schon lange nach einer lösung für mein Problem.

    ich zähle die Anzahl von Werten innerhalb einer Kalenderwoche. Wenn aber keine Werte gefunden wurden. Schreibt er keine "0" sondern lässt die zeile Leer.

    Meine aktuelle SQL abfrage lautet:

    SELECT WKZ_KALENDERWOCHE, Count(*) AS pthb_anzahl FROM WKZ_Anfrage WHERE WKZ_VORLAUF>240 AND WKZ_ABTEILUNG='PCPT' AND WKZ_BEARBEITUNG ='HART' GROUP BY WKZ_KALENDERWOCHE

    Wie muss ich mein Befehl anpassen

    ==>> Ich arbeite mit Acces2007!!!

    Donnerstag, 7. März 2013 10:31

Antworten

  • Hallo,

    das dürfte Stefan auch erkannt haben .

    Unabhängig vom COUNT() gilt in SQL: Wenn es keine Zeilen gibt, auf die die Kriterien zutreffen, so gibt es ein leeres Ergebnis.

    Dann gibt es keine WKZ_KALENDERWOCHE auf die Kriterien zutreffen und somit auch keine Anzahl.

    Willst Du Kalenderwochen mit 0 sehen, die keine Ergebnisse haben, brauchst Du eine zusätzliche Quelle, die Dir die möglichen Kalenderwochen aufzählt. Das kann entweder eine eigene Tabelle oder aber eine zusätzliche Abfrage auf die Tabelle sein - wobei dabei die Kriterien so gewählt sein müssen, das sie ein Ergebnis liefern.

    Eine Möglichkeit mit der einen Tabelle auszukommen wäre:

    SELECT w1.WKZ_KALENDERWOCHE, w2.pthb_anzahl
    FROM (SELECT DISTINCT WKZ_KALENDERWOCHE FROM WKZ_Anfrage) AS w1
    LEFT JOIN (SELECT WKZ_KALENDERWOCHE,  Count(*) AS pthb_anzahl 
       FROM WKZ_Anfrage 
       WHERE WKZ_VORLAUF>240 AND WKZ_ABTEILUNG='PCPT' AND WKZ_BEARBEITUNG ='HART' 
       GROUP BY WKZ_KALENDERWOCHE) AS W2
       ON w1.WKZ_KALENDERWOCHE = w2.WKZ_KALENDERWOCHE;

    Zulässig wären Kriterien für den ersten Teil (wie z. B. die Abteilung), solange dabei noch was bei herauskommt.

    Gruß Elmar


    Donnerstag, 7. März 2013 11:29
    Beantworter
  • Ähm,

    das mit Access 2007 hatte ich (und Elmar wohl auch :) übersehen.

    Da solltest Du dir in Access eine Abfrage (Name wäre hier angenommen: "Kalenderwochen") erstellen, die dann vom SQL Statement her aussieht:

    SELECT DISTINCT WKZ_KALENDERWOCHE
    FROM   WKZ_Anfrage

    Die eigentliche Abfrage sieht dann so aus:

    SELECT   kw.KALENDERWOCHE,
             anf.WKZ_KALENDERWOCHE,
             COUNT( 1 ) AS pthb_anzahl
    FROM     Kalenderwochen kw
             LEFT JOIN WKZ_Anfrage an ON kw.KALENDERWOCHE = anf.WKZ_KALENDERWOCHE
    WHERE    anf.WKZ_VORLAUF     > 240
    AND      anf.WKZ_ABTEILUNG   = 'PCPT'
    AND      anf.WKZ_BEARBEITUNG = 'HART'
    GROUP BY kw.KALENDERWOCHE,
             anf.WKZ_KALENDERWOCHE
    


    Gruß, Stefan
    Microsoft MVP - Visual Developer ASP/ASP.NET
    http://www.asp-solutions.de/ - Consulting, Development
    http://www.aspnetzone.de/ - ASP.NET Zone, die ASP.NET Community


    Donnerstag, 7. März 2013 12:02
    Moderator

Alle Antworten

  • Hi,

    Count ist nicht empty, 0 oder was anderes. Es gibt einfach keine Zeilen für diese WKZ_KALENDERWOCHE.

    Wenn Du in einer anderen Tabelle alle möglichen Kalenderwochen hast, musst Du diese als Grundlage für die Abfrage nehmen und sie bspw. mit einem LEFT JOIN mit der WKZ_Anfrage Tabelle verbinden.

    SELECT   kw.KALENDERWOCHE,
             anf.WKZ_KALENDERWOCHE,
             COUNT( 1 ) AS pthb_anzahl
    FROM     KALENDERWOCHEN kw
             LEFT JOIN WKZ_Anfrage an ON kw.KALENDERWOCHE = anf.WKZ_KALENDERWOCHE
    WHERE    anf.WKZ_VORLAUF     > 240
    AND      anf.WKZ_ABTEILUNG   = 'PCPT'
    AND      anf.WKZ_BEARBEITUNG = 'HART'
    GROUP BY kw.KALENDERWOCHE,
             anf.WKZ_KALENDERWOCHE
    

    So in etwa könnte das aussehen. Das ist natürlich nur ein Beispiel und könnte noch Fehler beinhalten. Den Weg sollte es aber zeigen.


    Gruß, Stefan
    Microsoft MVP - Visual Developer ASP/ASP.NET
    http://www.asp-solutions.de/ - Consulting, Development
    http://www.aspnetzone.de/ - ASP.NET Zone, die ASP.NET Community

    Donnerstag, 7. März 2013 10:53
    Moderator
  • Das Problem ist. Es gibt nur eine Tabelle! (Eine Datenbank Eine Tabelle)
    Donnerstag, 7. März 2013 11:05
  • Hallo,

    das dürfte Stefan auch erkannt haben .

    Unabhängig vom COUNT() gilt in SQL: Wenn es keine Zeilen gibt, auf die die Kriterien zutreffen, so gibt es ein leeres Ergebnis.

    Dann gibt es keine WKZ_KALENDERWOCHE auf die Kriterien zutreffen und somit auch keine Anzahl.

    Willst Du Kalenderwochen mit 0 sehen, die keine Ergebnisse haben, brauchst Du eine zusätzliche Quelle, die Dir die möglichen Kalenderwochen aufzählt. Das kann entweder eine eigene Tabelle oder aber eine zusätzliche Abfrage auf die Tabelle sein - wobei dabei die Kriterien so gewählt sein müssen, das sie ein Ergebnis liefern.

    Eine Möglichkeit mit der einen Tabelle auszukommen wäre:

    SELECT w1.WKZ_KALENDERWOCHE, w2.pthb_anzahl
    FROM (SELECT DISTINCT WKZ_KALENDERWOCHE FROM WKZ_Anfrage) AS w1
    LEFT JOIN (SELECT WKZ_KALENDERWOCHE,  Count(*) AS pthb_anzahl 
       FROM WKZ_Anfrage 
       WHERE WKZ_VORLAUF>240 AND WKZ_ABTEILUNG='PCPT' AND WKZ_BEARBEITUNG ='HART' 
       GROUP BY WKZ_KALENDERWOCHE) AS W2
       ON w1.WKZ_KALENDERWOCHE = w2.WKZ_KALENDERWOCHE;

    Zulässig wären Kriterien für den ersten Teil (wie z. B. die Abteilung), solange dabei noch was bei herauskommt.

    Gruß Elmar


    Donnerstag, 7. März 2013 11:29
    Beantworter
  • Hi,

    dann gibt es wohl keine WKZ_KALENDERWOCHE, die mit der WHERE Klausel ermittelt werden kann.

    Falls Du alle eindeutigen WKZ_KALENDERWOCHE aus der Tabelle und dazu dann die Anzahl anhand der WHERE Klausel ermitteln willst, geht das ggfs. auch so:

    WITH Query AS
    (
    SELECT DISTINCT WKZ_KALENDERWOCHE
    FROM   WKZ_Anfrage
    )
    SELECT   kw.KALENDERWOCHE,
             anf.WKZ_KALENDERWOCHE,
             COUNT( 1 ) AS pthb_anzahl
    FROM     Query kw
             LEFT JOIN WKZ_Anfrage an ON kw.KALENDERWOCHE = anf.WKZ_KALENDERWOCHE
    WHERE    anf.WKZ_VORLAUF     > 240
    AND      anf.WKZ_ABTEILUNG   = 'PCPT'
    AND      anf.WKZ_BEARBEITUNG = 'HART'
    GROUP BY kw.KALENDERWOCHE,
             anf.WKZ_KALENDERWOCHE


    Gruß, Stefan
    Microsoft MVP - Visual Developer ASP/ASP.NET
    http://www.asp-solutions.de/ - Consulting, Development
    http://www.aspnetzone.de/ - ASP.NET Zone, die ASP.NET Community

    Donnerstag, 7. März 2013 11:31
    Moderator
  • irgendwie komme ich auf keine Lösung.

    Donnerstag, 7. März 2013 11:50
  • Hallo,

    das dürfte Stefan auch erkannt haben .

    Unabhängig vom COUNT() gilt in SQL: Wenn es keine Zeilen gibt, auf die die Kriterien zutreffen, so gibt es ein leeres Ergebnis.

    Dann gibt es keine WKZ_KALENDERWOCHE auf die Kriterien zutreffen und somit auch keine Anzahl.

    Willst Du Kalenderwochen mit 0 sehen, die keine Ergebnisse haben, brauchst Du eine zusätzliche Quelle, die Dir die möglichen Kalenderwochen aufzählt. Das kann entweder eine eigene Tabelle oder aber eine zusätzliche Abfrage auf die Tabelle sein - wobei dabei die Kriterien so gewählt sein müssen, das sie ein Ergebnis liefern.

    Eine Möglichkeit mit der einen Tabelle auszukommen wäre:

    SELECT w1.WKZ_KALENDERWOCHE, w2.pthb_anzahl
    FROM (SELECT DISTINCT WKZ_KALENDERWOCHE FROM WKZ_Anfrage) AS w1
    LEFT JOIN (SELECT w1.WKZ_KALENDERWOCHE,  Count(*) AS pthb_anzahl 
       FROM WKZ_Anfrage 
       WHERE WKZ_VORLAUF>240 AND WKZ_ABTEILUNG='PCPT' AND WKZ_BEARBEITUNG ='HART' 
       GROUP BY WKZ_KALENDERWOCHE) AS W2
       ON w1.WKZ_KALENDERWOCHE = w2.WKZ_KALENDERWOCHE;

    Zulässig wären Kriterien für den ersten Teil (wie z. B. die Abteilung), solange dabei noch was bei herauskommt.

    Gruß Elmar

    Warum will er bei dieser Lösung ein Parameter von mir haben?
    Donnerstag, 7. März 2013 11:51
  • Ähm,

    das mit Access 2007 hatte ich (und Elmar wohl auch :) übersehen.

    Da solltest Du dir in Access eine Abfrage (Name wäre hier angenommen: "Kalenderwochen") erstellen, die dann vom SQL Statement her aussieht:

    SELECT DISTINCT WKZ_KALENDERWOCHE
    FROM   WKZ_Anfrage

    Die eigentliche Abfrage sieht dann so aus:

    SELECT   kw.KALENDERWOCHE,
             anf.WKZ_KALENDERWOCHE,
             COUNT( 1 ) AS pthb_anzahl
    FROM     Kalenderwochen kw
             LEFT JOIN WKZ_Anfrage an ON kw.KALENDERWOCHE = anf.WKZ_KALENDERWOCHE
    WHERE    anf.WKZ_VORLAUF     > 240
    AND      anf.WKZ_ABTEILUNG   = 'PCPT'
    AND      anf.WKZ_BEARBEITUNG = 'HART'
    GROUP BY kw.KALENDERWOCHE,
             anf.WKZ_KALENDERWOCHE
    


    Gruß, Stefan
    Microsoft MVP - Visual Developer ASP/ASP.NET
    http://www.asp-solutions.de/ - Consulting, Development
    http://www.aspnetzone.de/ - ASP.NET Zone, die ASP.NET Community


    Donnerstag, 7. März 2013 12:02
    Moderator
  • Hallo,

    Access hat die Angewohnheit alles, was es nicht (er)kennt als Parameter zu interpretieren. Welchen Parameter möchte er denn?

    Ich hatte im zweiten Teil aus Versehen das W1 in w1.WKZ_KALENDERWOCHE kopiert, entferne den Alias bitte - im ersten Beitrag habe ich es abgeändert.

    Wir haben Deine Tabelle / Abfragen hier nicht, und so ist ein wenig Mitarbeit auf Deiner Seite unerlässlich.

    Gruß Elmar

    @Stefan: Verschachtelte Abfragen kann Access schon.

    Donnerstag, 7. März 2013 13:47
    Beantworter
  • Hallo Elmar,

    @Stefan: Verschachtelte Abfragen kann Access schon.

    ah, Ok. Da hab ich Access wohl doch unterschätzt. Danke für die Info.

    Nur schade, dass CTEs nicht funktionieren, dann wäre es noch einfacher :)


    Gruß, Stefan
    Microsoft MVP - Visual Developer ASP/ASP.NET
    http://www.asp-solutions.de/ - Consulting, Development
    http://www.aspnetzone.de/ - ASP.NET Zone, die ASP.NET Community

    Donnerstag, 7. März 2013 13:49
    Moderator