Freigeben über


Verwenden von HAVING- und WHERE-Klauseln in derselben Abfrage (Visual Database Tools)

In einigen Fällen sollten Sie einzelne Zeilen aus Gruppen (mithilfe einer WHERE-Klausel) ausschließen, bevor Sie eine Bedingung als Ganzes auf Gruppen anwenden (mithilfe einer HAVING-Klausel).

Eine HAVING-Klausel ist wie eine WHERE-Klausel, gilt jedoch nur für Gruppen als Ganzes (d. h. für die Zeilen in der Ergebnismenge, die Gruppen darstellen), während die WHERE-Klausel für einzelne Zeilen gilt. Eine Abfrage kann sowohl eine WHERE-Klausel als auch eine HAVING-Klausel enthalten. In diesem Fall:

  • Die WHERE-Klausel wird zuerst auf die einzelnen Zeilen in den Tabellen oder Tabellenwertobjekten im Diagrammbereich angewendet. Nur die Zeilen, die die Bedingungen in der WHERE-Klausel erfüllen, werden gruppiert.

  • Die HAVING-Klausel wird dann auf die Zeilen im Resultset angewendet. Nur die Gruppen, die die HAVING-Bedingungen erfüllen, werden in der Abfrageausgabe angezeigt. Sie können eine HAVING-Klausel nur auf Spalten anwenden, die auch in der GROUP BY-Klausel oder in einer Aggregatfunktion angezeigt werden.

Stellen Sie sich beispielsweise vor, dass Sie die Tabellen titles und publishers verknüpfen, um eine Abfrage zu erstellen, die den durchschnittlichen Buchpreis für eine Reihe von Verlegern anzeigt. Sie möchten den Durchschnittspreis nur für eine bestimmte Gruppe von Herausgebern sehen - vielleicht nur die Herausgeber im Bundesstaat Kalifornien. Und selbst dann möchten Sie den Durchschnittspreis nur sehen, wenn er über 10,00 $ liegt.

Sie können die erste Bedingung festlegen, indem Sie eine WHERE-Klausel einschließen, die alle Herausgeber verwirft, die sich nicht in Kalifornien befinden, bevor Sie die durchschnittlichen Preise berechnen. Für die zweite Bedingung ist eine HAVING-Klausel erforderlich, da die Bedingung auf den Ergebnissen der Gruppierung und Zusammenfassung der Daten basiert. Die resultierende SQL-Anweisung könnte wie folgt aussehen:

SELECT titles.pub_id, AVG(titles.price)  
FROM titles INNER JOIN publishers  
   ON titles.pub_id = publishers.pub_id  
WHERE publishers.state = 'CA'  
GROUP BY titles.pub_id  
HAVING AVG(price) > 10  

Sie können sowohl HAVING- als auch WHERE-Klauseln im Kriterienbereich erstellen. Wenn Sie eine Suchbedingung für eine Spalte angeben, wird die Bedingung standardmäßig Teil der HAVING-Klausel. Sie können die Bedingung jedoch als WHERE-Klausel ändern.

Sie können eine WHERE-Klausel und HAVING-Klausel erstellen, die dieselbe Spalte enthält. Dazu müssen Sie die Spalte zweimal zum Kriterienbereich hinzufügen und dann eine Instanz als Teil der HAVING-Klausel und die andere Instanz als Teil der WHERE-Klausel angeben.

So geben Sie eine WHERE-Bedingung in einer Aggregatabfrage an

  1. Geben Sie die Gruppen für Ihre Abfrage an. Weitere Informationen finden Sie unter Gruppenzeilen in Abfrageergebnissen (Visual Database Tools).

  2. Wenn sie noch nicht im Bereich "Kriterien" enthalten ist, fügen Sie die Spalte hinzu, auf der Sie die WHERE-Bedingung basieren möchten.

  3. Löschen Sie die Ausgabespalte , es sei denn, die Datenspalte ist Teil der GROUP BY-Klausel oder in einer Aggregatfunktion enthalten.

  4. Geben Sie in der Spalte "Filter " die WHERE-Bedingung an. Der Abfrage- und Ansichts-Designer fügt die Bedingung der HAVING-Klausel der SQL-Anweisung hinzu.

    Hinweis

    Die im Beispiel für diese Prozedur gezeigte Abfrage verknüpft zwei Tabellen, titles und publishers.

    An diesem Punkt in der Abfrage enthält die SQL-Anweisung eine HAVING-Klausel:

    SELECT titles.pub_id, AVG(titles.price)  
    FROM titles INNER JOIN publishers   
       ON titles.pub_id = publishers.pub_id  
    GROUP BY titles.pub_id  
    HAVING publishers.state = 'CA'  
    
  5. Wählen Sie in der "Gruppieren nach" Spalte Wo aus der Liste der Gruppen- und Zusammenfassungsoptionen. Der Abfrage- und Ansichts-Designer entfernt die Bedingung aus der HAVING-Klausel in der SQL-Anweisung und fügt sie der WHERE-Klausel hinzu.

    Die SQL-Anweisung ändert sich, um stattdessen eine WHERE-Klausel einzuschließen:

    SELECT titles.pub_id, AVG(titles.price)  
    FROM titles INNER JOIN publishers   
       ON titles.pub_id = publishers.pub_id  
    WHERE publishers.state = 'CA'  
    GROUP BY titles.pub_id  
    

Siehe auch

Sortier- und Gruppenabfrageergebnisse (Visuelle Datenbanktools)
Zusammenfassen von Abfrageergebnissen (Visuelle Datenbanktools)