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

.
Était-ce utile?

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.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top