Question
Voir l'instruction SQL suivante:
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
Si le suit a été ajouté:
HAVING datediff("d", MAX(invoice.date), Now) > 365
serait-ce simplement exclure les lignes avec DATE_DIFF <= 365?
Quel devrait être l'effet de la clause HAVING ici?
EDIT: Je ne suis pas ce que les réponses éprouvais disent ici. Une copie du mdb est à http://hotfile.com/dl/40641614 /2353dfc/test.mdb.html (pas de macros ou de virus). VISDATA.EXE est utilisé pour exécuter les requêtes.
EDIT2: Je pense que le problème pourrait être VISDATA, parce que je fais l'expérience des résultats différents par DAO
.La solution
Comme nous l'avons souligné, oui, qui est l'effet. Pour être complet, « avoir » est comme « où », mais pour les valeurs déjà agrégées (groupées) (tels que, MAX, dans ce cas, ou SUM ou COUNT, ou l'un des autres fonctions d'agrégat).
Autres conseils
Oui, elle exclurait ces lignes.
Oui, c'est-ce qu'il ferait.
WHERE applique à toutes les lignes individuelles, alors où MAX (...) correspondrait à toutes les lignes.
HAVING est comme WHERE, mais au sein du groupe actuel. Cela signifie que vous pouvez faire des choses comme HAVING COUNT (*)> 1, qui ne montrent des groupes avec plus d'un résultat.
Pour répondre à votre question, il ne comprendrait que des lignes où l'enregistrement du groupe qui a la date la plus élevée (MAX) est supérieure à 365. Dans ce cas, vous choisissez aussi MAX (date), donc oui, il exclut les lignes avec date_diff <= 365.
Cependant, vous pouvez sélectionner MIN (date) et voir la date minimum dans tous les groupes qui ont une date maximale supérieure à 365. Dans ce cas, il ne serait pas exclure les « lignes » avec date_diff <= 365, mais plutôt des groupes avec max (date_diff) <= 365.
Espérons que ce n'est pas trop confus ...
Vous pouvez essayer la mauvaise chose avec votre MAX. En plafonnait la colonne invoice.date vous êtes à la recherche efficace pour la plupart facture récente associée avec le client. Donc, effectivement la condition HAVING sélectionne tous les clients qui ont pas HAD tout factures au cours des 365 derniers jours.
Est-ce que vous essayez de faire? Ou êtes-vous en train d'essayer d'obtenir tous les clients qui ont au moins une facture de plus il y a un an? Si tel est le cas, alors vous devriez mettre le MAX en dehors de la fonction datediff.
Cela dépend de vous dire les lignes de la table ou de lignes dans le résultat. La clause having
filtre le résultat après le regroupement, donc il elliminate clients, pas les factures.
Si vous voulez filtrer les nouvelles factures plutôt que les clients avec de nouvelles factures, vous devez utiliser where
à la place afin que vous filtrer avant de regroupement:
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
Je ne pas utiliser GROUP BY requête du tout. En utilisant la norme 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));
En utilisant le mode de 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 clé ici est d'obtenir un ensemble des numéros des clients qui ont eu une facture de l'année dernière, et faire ensuite un OUTER JOIN sur cet ensemble de résultats pour retourner uniquement les pas dans l'ensemble des clients des factures dans la l'an dernier.