SQL: la clausola HAVING
Domanda
Si veda la seguente istruzione SQL:
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
Se è stato aggiunto il quanto segue:
HAVING datediff("d", MAX(invoice.date), Now) > 365
sarebbe questo semplicemente escludere le righe con date_diff <= 365?
Quale dovrebbe essere l'effetto della clausola HAVING qui?
EDIT: Io non sto vivendo quello che le risposte qui hanno da dire. Una copia del mdb è a http://hotfile.com/dl/40641614 /2353dfc/test.mdb.html (nessun macro o virus). VISDATA.EXE viene utilizzato per eseguire le query.
EDIT2: Penso che il problema potrebbe essere VISDATA, perché io sto sperimentando risultati diversi tramite DAO
.Soluzione
Come già sottolineato, sì, che è l'effetto. Per completezza, 'AVENTI' è come 'WHERE', ma per i valori già aggregati (raggruppati) (ad esempio, MAX in questo caso, o SUM o COUNT, o una qualsiasi delle altre funzioni di aggregazione).
Altri suggerimenti
Si, escluderebbe le righe.
Sì, questo è quello che avrebbe fatto.
in cui si applica a tutte le singole righe, quindi dove MAX (...) sarebbe partita tutte le righe.
avendo è come dove, ma all'interno del gruppo corrente. Ciò significa che si possono fare cose come avere COUNT (*)> 1, che non farà che mostrerà gruppi con più di un risultato.
Quindi, per rispondere alla tua domanda, sarebbe solo includere righe in cui il record nel gruppo che ha la più alta (MAX) data è maggiore di 365. In questo caso si sta anche Selezione MAX (data), quindi sì, esclude righe con date_diff <= 365.
Tuttavia, è possibile selezionare MIN (data) e vedere la data minima in tutti i gruppi che hanno una data massima superiore a 365. In questo caso non escluderebbe "righe" con date_diff <= 365, ma piuttosto gruppi con max (date_diff) <= 365.
Speriamo che non è troppo confuso ...
Si può tentare la cosa sbagliata con il MAX. Maxing la colonna invoice.date si sta effettivamente cercando la fattura più recente associato con il cliente. Così efficacemente la condizione HAVING sta selezionando tutti quei clienti che hanno non had qualsiasi le fatture entro gli ultimi 365 giorni.
E 'questo ciò che si sta cercando di fare? Oppure in realtà cercando di ottenere tutti i clienti che hanno almeno una fattura da più di un anno fa? Se questo è il caso, allora si dovrebbe mettere il MAX di fuori della funzione DateDiff.
Questo dipende dal fatto che si intende righe della tabella o righe nel risultato. La clausola having
filtra il risultato dopo il raggruppamento, quindi sarebbe elliminate clienti, non le fatture.
Se si desidera filtrare le nuove fatture, piuttosto che i clienti con nuove fatture, è necessario utilizzare where
invece in modo che si filtro prima di raggruppamento:
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
Non vorrei usare una query GROUP BY a tutti. Utilizzando standard di 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));
Utilizzo della modalità di compatibilità SQL92:
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));
La chiave qui è quello di ottenere una serie di numeri di clienti che hanno avuto una fattura nel corso dell'ultimo anno, e poi fare un join esterno su quel set di risultati per restituire solo quelli non nel gruppo di clienti con fatture in l'anno scorso.