2009-02-06 7 views
0

Dans MS Access, j'ai une requête où je veux utiliser une colonne dans la requête externe comme une condition dans la requête interne:Comparer la valeur subselect avec une valeur en maître sélectionner

SELECT P.FirstName, P.LastName, Count(A.attendance_date) AS CountOfattendance_date, 
     First(A.attendance_date) AS FirstOfattendance_date, 
     (SELECT COUNT (*) 
      FROM(SELECT DISTINCT attendance_date 
       FROM tblEventAttendance AS B 
       WHERE B.event_id=8 
        AND B.attendance_date >= FirstOfattendance_date) 
     ) AS total 
FROM tblPeople AS P INNER JOIN tblEventAttendance AS A ON P.ID = A.people_id 
WHERE A.event_id=8 
GROUP BY P.FirstName, P.LastName 
; 

Le point clé est FirstOfattendance_date - Je souhaite que la comparaison soit approfondie dans le sous-menu pour utiliser la valeur dans chaque itération de la sélection principale. Évidemment, cela ne fonctionne pas, il me demande la valeur de FirstOfattendance_date lorsque j'essaie de l'exécuter.

Je voudrais faire cela sans avoir recours au code VB ... des idées?

+0

Quelle est la sous-requête complexe dans la liste de sélection destinée à compter? Ce n'est pas clair, mais cela peut être le nombre de fois que la personne a assisté à Event_ID 8 après le premier jour où ils ont assisté à Event_ID 8. Nous ne pouvons pas dire si quelqu'un peut y assister plusieurs fois, notamment. –

+0

C'est exactement cela - Nous voulons compter la présence totale des dates possibles après leur première participation, qui peut ne pas être lorsque l'événement a commencé. Supposons seulement une présence par jour. – DGM

Répondre

1

Que diriez-vous:

SELECT 
    p.FirstName, 
    p.LastName, 
    Count(a.attendance_date) AS CountOfattendance_date, 
    First(a.attendance_date) AS FirstOfattendance_date, 
    c.total 
FROM (
    tblPeople AS p 
INNER JOIN tblEventAttendance AS a ON 
    a.people_id = p.ID) 
INNER JOIN (SELECT people_id, Count (attendance_date) As total 
      FROM (
       SELECT DISTINCT people_id,attendance_date 
       FROM tblEventAttendance) 
      Group By people_id) AS c ON 
    p.ID = c.people_id 
GROUP BY 
    p.ID, c.total; 
+0

Cela peut se rapprocher, mais il a perdu la partie event_id = 8, et une recherche distincte pour les dates possibles. Mais je pense que c'est sur la bonne voie, en plaçant la logique de sous sélection dans la zone de départ au lieu de la zone sélectionnée. – DGM

+0

Je ne me souviens pas si cela a déjà été résolu, mais cette réponse était sur la bonne voie. – DGM

0

Pouvez-vous changer

B.attendance_date> = FirstOfattendance_date

à

B.attendance_date> = First (A.attendance_date)

+0

intéressant, mais il est dit que vous ne pouvez pas avoir une fonction d'agrégat dans une clause where. – DGM

+0

Les fonctions d'agrégation ne peuvent être utilisées comme critère que dans la clause HAVING. Puisque vous utilisez la valeur de la sous-requête agrégée corrélée, vous devez utiliser l'alias, car l'instruction SELECT dans laquelle vous l'utilisez n'est pas une requête agrégée. –

Questions connexes