J'ai quelques tables dans une base de données d'accès:Sélectionner une requête jointe sur deux champs?
ID | LocationName
1 | Location1
2 | Location2
ID | LocationID | Date | NumProductsDelivered
1 | 1 | 12/10 | 3
2 | 1 | 01/11 | 2
3 | 1 | 02/11 | 2
4 | 2 | 11/10 | 1
5 | 2 | 12/10 | 1
ID | LocationID | Date | NumEmployees | EmployeeType
1 | 1 | 12/10 | 10 | 1 (=Permanent)
2 | 1 | 12/10 | 3 | 2 (=Temporary)
3 | 1 | 12/10 | 1 | 3 (=Support)
4 | 2 | 10/10 | 1 | 1
5 | 2 | 11/10 | 2 | 1
6 | 2 | 11/10 | 1 | 2
7 | 2 | 11/10 | 1 | 3
8 | 2 | 12/10 | 2 | 1
9 | 2 | 12/10 | 1 | 3
Ce que je veux faire est de passer dans le LocationID comme paramètre et revenir quelque chose comme le tableau suivant. Donc, si je passe 2 mon LocationID, je devrais:
Date | NumProductsDelivered | NumPermanentEmployees | NumSupportEmployees
10/10 | | 1 |
11/10 | 1 | 2 | 1
12/10 | 1 | 2 | 1
Il semble que cela devrait être une question assez simple. Je n'ai vraiment pas besoin de la première table, sauf comme un moyen de remplir la zone de liste déroulante sur le formulaire à partir duquel l'utilisateur choisit l'emplacement pour lequel il veut un rapport. Malheureusement, tout ce que j'ai fait m'a permis d'obtenir beaucoup plus de données que je n'aurais dû. Ma confusion est dans la façon de mettre en place la jointure (probablement c'est ce que je recherche ici) étant donné que je veux que les deux date et locationID soient les mêmes pour chaque ligne dans le jeu de résultats.
Toute aide serait grandement appréciée.
Merci.
EDIT: Ok - la réponse ci-après ne pas tout à fait le travail, mais il m'a fait mis sur la bonne voie et j'ai pu utiliser la requête suivante:
SELECT t1.Date, t2.NumProductsDelivered,
(SELECT t1a.NumEmployees
FROM table3 t1a
WHERE t1a.EmployeeType=1 AND t1a.LocationID=t1.LocationID AND t1a.Date= t1.Date)
AS "PermEmps",
(SELECT t1b.NumEmployees
FROM table3 t1b
WHERE t1b.EmployeeType=3 AND t1b.LocationID=t1.LocationID AND t1b.Date=t1.Date)
AS "SupportEmps"
FROM table3 AS t1 LEFT JOIN table2 AS t2 ON (t2.Date=t1.Date)
AND (t2.LocationID=t1.LocationID)
WHERE t1.LocationID=2
GROUP BY t1.Date, t1.LocationID, t2.NumProductsDelivered;
Cela me devient les résultats que je cherchais. Cependant, dans un cas où l'emplacement a une pause entre les produits livrés, je ne vois pas les bons résultats. Il semble que le jeu d'enregistrements s'arrête dès qu'il y a une ligne vide et qu'il ne se relève plus jamais. Alors, où je pourrais attendre à voir ceci:
Date | NumProductsDelivered | NumPermanentEmployees | NumSupportEmployees
10/10 | | 1 |
11/10 | 1 | 2 | 1
12/10 | 1 | 2 | 1
01/10 | 2 | | 1
06/10 | 1 | |
Je vois seulement ceci:
Date | NumProductsDelivered | NumPermanentEmployees | NumSupportEmployees
10/10 | | 1 |
11/10 | 1 | 2 | 1
12/10 | 1 | 2 | 1
01/10 | 2 | | 1
Vous ne devriez pas avoir à GROUP BY t1.LocationID puisque vous ne le sélectionnant et il est toujours 2. Je voudrais aussi recommande d'utiliser de meilleurs noms que "t1" pour la lisibilité.L'autre problème est un mystère ... Avez-vous une relation 1-à-1 entre t1 et t2? Aussi, essayez de sortir la jointure et sous-sélectionne pour voir si vous obtenez tous les dates dont vous avez besoin (je vais ajouter à ma réponse ci-dessous) –