Frage

Sehen Sie die folgende SQL-Anweisung:

SELECT datediff("d", MAX(invoice.date), Now) As Date_Diff
      , MAX(invoice.date) AS max_invoice_date
      , customer.number AS customer_number
FROM invoice 
    INNER JOIN customer 
        ON invoice.customer_number = customer.number
GROUP BY customer.number 

Wenn die Folgendes wurde hinzugefügt:

HAVING datediff("d", MAX(invoice.date), Now) > 365

würde dies einfach ausschließen Zeilen mit date_diff <= 365?

Was die Wirkung der HAVING-Klausel soll hier?

EDIT: Ich erlebe nicht, was die hier Antworten sagen. Eine Kopie des mdb ist unter http://hotfile.com/dl/40641614 /2353dfc/test.mdb.html (keine Makros oder Viren). VISDATA.EXE wird verwendet werden, um die Abfragen auszuführen.

EDIT2: Ich denke, das Problem VISDATA sein könnte, weil ich unterschiedliche Ergebnisse über DAO erleben

.
War es hilfreich?

Lösung

Wie bereits erwähnt, ja, das ist der Effekt. Der Vollständigkeit halber ‚MIT‘ ist wie ‚WHERE‘, aber für die bereits aggregiert (gruppiert) Werte (wie MAX in diesem Fall oder SUM oder COUNT oder eine der anderen Aggregatfunktionen).

Andere Tipps

Ja, es wäre die Zeilen ausschließen.

Ja, das ist es, was es tun würde.

Wo man alle einzelnen Zeilen gilt, also wo MAX (...) würde alle Zeilen entsprechen.

ist wie mit WHERE, aber innerhalb der aktuellen Gruppe. Das heißt, Sie können Dinge wie Zählerstand (*)> 1, die nur Gruppen zeigen mit mehr als einem Ergebnis.

So Ihre Frage zu beantworten, wäre es nur schließen Zeilen, in denen der Datensatz in der Gruppe, die das höchste (MAX) Datum hat, ist größer als 365. In diesem Fall können Sie auch MAX sind die Auswahl (Datum), also ja, es umfasst nicht Zeilen mit date_diff <= 365.

Sie können jedoch wählen MIN (Datum) und die Mindestfrist in allen Gruppen sehen, die ein maximales Datum von mehr als 365. In diesem Fall habe es nicht „Reihen“ ausschließen mit date_diff <= 365, sondern Gruppen mit max (date_diff) <= 365.

Hoffentlich ist es nicht zu verwirrend ...

Diese können Sie die falsche Sache mit Ihrem MAX versuchen. Durch Maxing die invoice.date Spalte, die Sie effektiv suchen die neueste Rechnung mit dem Kunden in Verbindung gebracht. So effektiv die HAVING Bedingung alle diese Kunden ist die Auswahl, die haben nicht had jede Rechnungen innerhalb der letzten 365 Tage.

Ist das, was Sie zu tun versuchen? Oder wollen Sie wirklich alle Kunden zu erhalten, die mindestens eine Rechnung hat von mehr als vor einem Jahr? Wenn das der Fall ist, dann sollten Sie den MAX außerhalb der datediff Funktion setzen.

Das hängt davon ab, ob Sie meine Zeilen in der Tabelle oder Zeilen im Ergebnis. Die having Klausel filtert das Ergebnis nach dem Gruppieren, so dass es Kunden elliminate würde, keine Rechnungen.

Wenn Sie die neuen Rechnungen, anstatt die Kunden mit neuen Rechnungen herausfiltern möchten, sollten Sie where verwenden stattdessen so, dass Sie filtern, bevor die Gruppierung:

select
  datediff("d",
  max(invoice.date), Now) As Date_Diff,
  max(invoice.date) as max_invoice_date,
  customer.number
from
  invoice 
  inner join customer on invoice.customer_number = customer.number
where
  datediff("d", invoice.date, Now) > 365
group by
  customer.number

Ich würde nicht ein GROUP BY-Abfrage überhaupt. Mit Standard-Jet SQL:

  SELECT Customer.Number
  FROM [SELECT DISTINCT Invoice.Customer_Number
     FROM Invoice
     WHERE (((Invoice.[Date])>Date()-365));]. AS Invoices 
  RIGHT JOIN Customer ON Invoices.Customer_Number = Customer.Number
  WHERE (((Invoices.Customer_Number) Is Null));

Mit SQL-92-Kompatibilitätsmodus:

  SELECT Customer.Number
  FROM (SELECT DISTINCT Invoice.Customer_Number
     FROM Invoice
     WHERE (((Invoice.[Date])>Date()-365));) AS Invoices 
  RIGHT JOIN Customer ON Invoices.Customer_Number = Customer.Number
  WHERE (((Invoices.Customer_Number) Is Null));

Der Schlüssel hier ist einen Satz der Kundenzahlen zu erhalten, die eine Rechnung im letzten Jahr gehabt hat, und dann auch nur in den diejenigen, die nicht in der Gruppe von Kunden mit Rechnungen tut einer OUTER JOIN auf dieser Ergebnismenge zurück im letzten Jahr.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top