Question

Je vais avoir des problèmes avec Microsoft Access 2003, il se plaint de cette déclaration:

select cardnr
from change
where  year(date)<2009
group by cardnr
having max(time+date) = (time+date) and cardto='VIP'

Ce que je veux faire est, pour chaque cardnr distincte dans le changement de table, de trouver la ligne avec la dernière (heure date +) qui est avant l'année 2009, puis sélectionnez uniquement les lignes avec cardto = « VIP ».

validateur dit est OK, l'accès dit que ce n'est pas OK .

Ceci est le message que je reçois: « vous avez essayé d'exécuter une requête qui ne comprend pas l'expression spécifiée « max (heure + date) = heure et la date et cardto = » VIP « et cardnr = » dans le cadre d'un agrégat fonction. "

Quelqu'un pourrait-il expliquer ce que s'il vous plaît je fais mal et la bonne façon de le faire? Merci

Note:. Les noms de champs et de tables sont traduites et ne pas entrer en collision avec des mots réservés, je n'ai pas du mal avec les noms

Était-ce utile?

La solution

Essayez de penser comme ça - HAVING est appliqué après l'agrégation se fait. Par conséquent, il ne peut pas comparer à des expressions non agrégées (ni pour heure et la date, ni pour cardto).

Cependant, pour obtenir le dernier (principe est le même pour obtenir des lignes liées à d'autres fonctions agrégées comme weel) heure et la date que vous pouvez faire quelque chose comme:

SELECT cardnr
FROM change main
WHERE time+date IN (SELECT MAX(time+date) 
                    FROM change sub
                    WHERE sub.cardnr = main.cardnr AND 
                          year(date)<2009 
                          AND cardto='VIP')

(en supposant qu'une partie de la date de votre champ de temps est le même pour tous les enregistrements, ayant deux champs pour la date / heure ne sont pas dans votre intérêt et aussi en utilisant des mots réservés pour les noms de champs peut se retourner contre dans certains cas)

Il fonctionne parce que la sous-requête est filtré uniquement sur les enregistrements que vous êtes intéressé par de la requête externe.

En appliquant la même année (date) <200 et cardto = 'VIP' à la requête externe peut améliorer encore les performances.

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