je les 2 tableaux suivants:Compliqué Requête analyse croisée Question
1) Entreprises
ID CompanyName Abbreviation Notes
1 CompanyA CA ...
2 CompanyB CB ...
3 CompanyC CC ...
2) PlannedDeployments
ID CompanyID TypeID DepDate NumDeployed
1 1 2 09/2010 5
2 1 2 10/2010 5
3 1 3 09/2010 3
4 1 3 10/2010 3
5 1 4 10/2010 4
6 2 2 12/2010 10
7 2 4 10/2010 1
8 3 2 11/2010 6
Notez que TypeID est un nombre compris entre 1 et 5 décrivant quel type de personne est en train d'être déployé. Pour les besoins de cette requête, je suis intéressé par les employés de type 2 pour chaque société et ensuite la somme des types 3 & 4 pour chaque date. Ce que je veux finalement finir avec un tableau croisé qui ressemble à ce qui suit:
Crosstab
Date/Company CompanyA CompanyB CompanyC SumOfTypes3and4
09/2010 5 3
10/2010 5 8
11/2010 6
12/2010 10
Le problème est que la dernière colonne - la somme de type 3 et type 4 employés. Le tableau croisé actuel que je comprend tout, sauf que la colonne de somme et se présente comme suit:
TRANSFORM Sum(PlannedDeployments.NumDeployed) AS ["NumDeployed"]
SELECT PlannedDeployments.DepDate
FROM PlannedDeployments LEFT JOIN Companies ON Companies.ID=PlannedDeployments.CompanyID
WHERE PlannedDeployments.TypeID=2 AND (PlannedDeployments.DepDate Between FormFieldValue("Form", "Control") AND FormFieldValue("Form", "Control"))
GROUP BY PlannedDeployments.DepDate
PIVOT Companies.CompanyName;
La deuxième partie de cette clause WHERE est simplement limiter les données par certains contrôles de formulaire. Quoi qu'il en soit, j'ai beaucoup de mal à obtenir cette dernière colonne. Quelqu'un a des idées?
Edit: Miser sur la solution fournie par remou ci-dessous, voici ce que la requête finale a fini par ressembler à:
TRANSFORM Sum(PlannedDeployments.NumDeployed) AS ["NumDeployed"]
SELECT PlannedDeployments.DepDate, q.SumOfNumDeployed
FROM (SELECT PlannedDeployments.DepDate, Sum(PlannedDeployments.NumDeployed) AS SumOfNumDeployed
FROM PlannedDeployments
WHERE (((PlannedDeployments.[TypeID]) In (3,4)))
GROUP BY PlannedDeployments.DepDate) AS q
RIGHT JOIN (PlannedDeployments
INNER JOIN Companies ON PlannedDeployments.CompanyID = Companies.ID)
ON q.DepDate = PlannedDeployments.DepDate
WHERE PlannedDeployments.TypeID=2
AND (PlannedDeployments.DepDate Between FormFieldValue("Form", "Control")
AND FormFieldValue("Form", "Control"))
GROUP BY PlannedDeployments.DepDate, q.SumOfNumDeployed
PIVOT Companies.CompanyName;
Cela me fait vraiment proche, mais ce n'est pas tout à fait correct. Ce que je cherche dans cette dernière colonne est une somme-par-date, ce qui n'est pas tout à fait ce que je vois avec la requête ci-dessus. Compte tenu de mes données réelles, je m'attends à quelque chose comme: 1/2010: 2, 2/2010: 2, 3/2010: 4, 4/2010: 6 Et ce que je reçois à la place est: 1/2010: 2, 2/2010: 4, 3/2010: 12, 4/2010: 24. – wtollett
Vous avez également besoin de la sous-requête limitée par les dates sur le formulaire? Si c'est le cas, vous pouvez ajouter une instruction where à la sous-requête. – Fionnuala
Non - tout ce que j'ai fini par faire était de supprimer le Sum() de la deuxième ligne, puis d'ajouter un 'q.SumOfNumDeployed' à la clause GROUP BY sur l'avant-dernière ligne et les données semblent parfaites. Merci de votre aide. – wtollett