2010-09-15 27 views
1

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; 

Répondre

1

Vous pouvez utiliser une sous-requête:

TRANSFORM Sum(PlannedDeployments.NumDeployed) AS ["NumDeployed"] 
SELECT PlannedDeployments.DepDate, Sum(q.SumOfNumDeployed) AS SumOfSumOfNumDeployed 
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 
PIVOT Companies.CompanyName; 
+0

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

+0

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

+0

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