Je ne sais même pas si je fais cette requête correctement. Il y a une table Sandwiches
qui a 7 champs et 2 d'entre eux sont des comboboxes (Type
et Bread
).
J'ai donc fait une requête qui combine toutes les valeurs des zones de liste déroulante en une seule requête, comme ceci:
SELECT TypesAndBreads.TBName, TypesAndBreads.Type
FROM (SELECT [Sandwiches Types].[Sandwich Type] As TBName, "Sandwich Type" As Type
FROM [Sandwiches Types]
UNION ALL
SELECT Breads.Bread As TBName, "Bread" As Type
FROM Breads) AS TypesAndBreads;
Je reçois les valeurs plates des tableaux maintenant je veux compter tous les sandwichs sous chaque TypesAndBreads.TBName
. J'ai ceci, juste pour m'assurer qu'il fonctionne avec tous les sandwichs:
SELECT TypesAndBread.Type, TypesAndBread.TBName,
(SELECT Count(Sandwiches.[SandwichID]) As SandwichCount
FROM Sandwiches) As SandwichCount
FROM TypesAndBread;
Mais je veux faire référence au type et au TBName actuels dans la sous-requête. Quelque chose comme ça:
SELECT TypesAndBread.Type, TypesAndBread.TBName,
(SELECT Count(Sandwiches.[SandwichID]) As SandwichCount
FROM Sandwiches
WHERE Sandwiches.[TypesAndBread.Type] = Sandwiches.[TypesAndBread.TBName]) As SandwichCount
FROM TypesAndBread;
Mais bien sûr, cela ne fonctionne pas. Je ne pensais pas que ce serait le cas, je pensais juste à l'essayer. Je pensais peut-être construire la requête avec VBA quand ils ouvriront le rapport sur lequel cette requête va être basée.
Donc je suppose que ma question est: Existe-t-il un moyen de référencer les champs actuellement sélectionnés dans une sous-requête? Ou existe-t-il une manière différente d'aborder cela?
Merci pour l'aide
EDIT: Ma structure de table est comme ceci:
Champs de Sandwiches
| SandwichID | Name | Date Added | Chef | Sandwich Type | Bread | Reviewed By |
où Sandwich Type
et Bread
sont des champs de recherche pour ces tables:
Champs de Sandwiches Types
| Sandwich Type |
Champs de Breads
| Bread |
La requête TypesAndBreads a combiné les tables Sandwiches Types et Breads, mais la raison en est que je peux obtenir le nombre de tous les sandwichs qui ont ce type ou ce pain. Un résultat comme celui-ci:
+=============================================+
| Type | TBName | SandwichCount |
+=============================================+
| Sandwich Type | Turkey Club | 10 |
| Bread | Italian | 5 |
| Bread | Garlic | 8 |
+---------------------------------------------+
la première ligne du résultat d'exemple indique fondamentalement qu'il y a 10 sandwichs enregistrés avec le champ Type de sandwich égal à Turkey Club.
J'espère que cela explique mieux.
Je ne sais pas si Access le prend en charge, mais dans la plupart des moteurs (y compris SQL Server
) cela s'appelle une sous-requête corrélée et fonctionne très bien:
SELECT TypesAndBread.Type, TypesAndBread.TBName,
(
SELECT Count(Sandwiches.[SandwichID]) As SandwichCount
FROM Sandwiches
WHERE (Type = 'Sandwich Type' AND Sandwiches.Type = TypesAndBread.TBName)
OR (Type = 'Bread' AND Sandwiches.Bread = TypesAndBread.TBName)
) As SandwichCount
FROM TypesAndBread
Cela peut être rendu plus efficace en indexant Type
et Bread
et en répartissant les sous-requêtes sur UNION
:
SELECT [Sandwiches Types].[Sandwich Type] As TBName, "Sandwich Type" As Type,
(
SELECT COUNT(*) As SandwichCount
FROM Sandwiches
WHERE Sandwiches.Type = [Sandwiches Types].[Sandwich Type]
)
FROM [Sandwiches Types]
UNION ALL
SELECT [Breads].[Bread] As TBName, "Bread" As Type,
(
SELECT COUNT(*) As SandwichCount
FROM Sandwiches
WHERE Sandwiches.Bread = [Breads].[Bread]
)
FROM [Breads]
Je me compliquais trop. Après une longue pause et un retour, la sortie souhaitée pourrait être accomplie par cette simple requête:
SELECT Sandwiches.[Sandwich Type], Sandwich.Bread, Count(Sandwiches.[SandwichID]) AS [Total Sandwiches]
FROM Sandwiches
GROUP BY Sandwiches.[Sandwiches Type], Sandwiches.Bread;
Merci d'avoir répondu, cela a aidé ma réflexion.