2017-11-28 4 views
1
SELECT tb_publisher.book_name, AVG(tb_book.price) as average, MAX(tb_book.price), SUM(tb_book.price) 
FROM tb_book 
INNER JOIN tb_publisher 
on tb_book.id_publisher = tb_publisher.id_publisher 
WHERE 'average' < 70000 
GROUP BY tb_publisher.publisher_name 

Ich wollte ein Datum zeigen, wo Average Feld kleiner als 70000 ist (angeblich nur 1 Datensatz sein, dass unter dieser Nummer), kann ich nicht nachvollziehen warum es nicht zeigen will, anstatt alle Daten anzuzeigen. Ich habe alles versucht, was ich weiß, also wäre eine Hilfe dankbar. Danke für die Aufmerksamkeit.durschnittlich Preis, hoch Preis und Gesamtpreis Felder In Alias ​​

+2

Bitte markieren Sie die entsprechende DB, die Sie verwenden. Ich glaube nicht, dass Sie aggregierte Ergebnisse in einem 'wo' verwenden können. Ich glaube, das 'Where' wird zuerst ausgewertet, so dass dein' 'Durchschnitt'' als String betrachtet wird. – chris85

+0

Ja, ich denke, ich sollte das nicht tun, aber wenn ich nicht das '' setze, geht der SQL Fehler statt die Daten zu zeigen, also poste ich einfach das Skript auf diese Weise, lol. Wie auch immer, danke für die Hilfe, ich schätze es.^u ^. – Ervan

Antwort

2

Auf Ihre Anfrage, Sie tun: WHERE 'average' < 70000, bedeutet dies, dass Sie die string 'average' zum integer 700000, sind zu vergleichen, was natürlich nicht das, was Sie tun möchten.

Sie versuchen, nach einer aggregierten Spalte zu filtern. Das ist die genaue Definition des HAVING clause.

SELECT tb_publisher.book_name, AVG(tb_book.price) as average, MAX(tb_book.price), SUM(tb_book.price) 
FROM tb_book 
INNER JOIN tb_publisher 
    ON tb_book.id_publisher = tb_publisher.id_publisher 
GROUP BY tb_publisher.publisher_name 
HAVING AVG(tb_book.price) < 70000 

In anderen Notizen, können Sie den Primärschlüssel anstelle des Namens zu GROUP BY.

+1

Wow, vielen Dank für die Hilfe^_ ^, ich habe nie gelernt, dass in der Schule ist es scheiße, dass ich nicht versucht habe, es am besten zu suchen. Entschuldige den Ärger und danke für die Hilfe. – Ervan

+0

@Ervan Vergessen Sie nicht, eine Antwort als Antwort zu markieren. –

0

Die meisten Datenbanken können Sie auf die Tabelle alias in der having Klausel beziehen, so würde es wie folgt aussehen:

SELECT p.publisher_name, AVG(b.price) as average, MAX(b.price), SUM(b.price) 
FROM tb_book b INNER JOIN 
    tb_publisher p 
    ON b.id_publisher = p.id_publisher 
GROUP BY p.publisher_name 
HAVING average < 70000 ; 

Hinweise:

  • Die nicht aggregierten Spalten in der SELECT die Spalten übereinstimmen sollten in die GROUP BY. Ich bin nicht sicher, ob Sie die Informationen nach Buch oder Verlag wünschen, aber ich schätze nach Verlag.
  • Verwendung von Tabellenaliasen. Diese erleichtern das Schreiben und Lesen von Abfragen.
  • Einige Datenbanken haben Integer-Arithmetik. Wenn price eine Ganzzahl ist und Sie Dezimalstellen benötigen, benötigen Sie möglicherweise AVG(b.price * 1.0) oder etwas Ähnliches.
  • Nicht alle Datenbanken unterstützen die Verwendung von Tabellenaliasen in der HAVING-Klausel.
  • Wenn Sie wirklich vorsichtig sein möchten, würden Sie aggregieren, indem Sie p.id_publisher, weil es möglich ist, dass zwei verschiedene Publisher denselben Namen haben.
+0

Wow, es ist cool. Entschuldigung, es war nicht die richtige Tabelle, die ich hier gepostet habe, es ist nur eine Probe, die es den Lesern leichter macht, die Frage zu verstehen, die ich stellen wollte. Und auch vielen Dank für die Antwort, Ihr Skript ist leichter zu merken. Und tut mir leid für die Mühe, Gott segne.^_ ^ – Ervan