2011-08-05 2 views
4

Je suit (simplifié) requête:Grouper par colonnes + COUNT (*), comment obtenir le nombre moyen de chaque combinaison?

SELECT  ResolvedBy, COUNT(*) AS Count, fiCategory, fiSubCategory, fiSymptom 
FROM   tContact 
WHERE  (ResolvedBy IS NOT NULL) 
GROUP BY ResolvedBy, fiCategory, fiSubCategory, fiSymptom 
ORDER BY Count DESC 

maintenant j'ai besoin le nombre moyen pour chaque combinaison de fiCategory, fiSubCategory, fiSymptom comme colonne. Comment faire ça?

Par exemple:

ResolvedBy Count fiCategory fiSubCategory fiSymptom Average 
    1   50   1    2    3   40 
    2   30   1    2    3   40 
    3   40   1    2    3   40 
    1   20   2    3    4   30 
    2   40   2    3    4   30 

Dans l'exemple sont deux combinaisons de fiCategory, fiSubCategory et fiSymptom: 1,2,3 et 2,3,4. Par conséquent, il y a deux moyennes qui sont calculées:

  1. 50 + 30 + 40/3 = 40
  2. 20 + 40/2 = 30.

donc je veux résumer le nombre de chaque combiner et diviser par le nombre d'occurrences.

Modifier: L'exemple est une extraction du résultat souhaité de la requête. Le nombre est la somme de toutes les occurrences de cette combinaison pour chaque ResolvedBy.

Merci d'avance.

+1

Pour aider à déterminer une solution, comment vous arrivez à la moyenne? – RobB

+0

Voulez-vous dire la moyenne en utilisant les données montrées? C'est-à-dire que la moyenne pour la catégorie de la catégorie serait (1 + 1 + 1 + 2 + 2)/5 = 1,4? – Thomas

+0

Il pourrait également aider à voir ce que vous attendez de la sortie à ressembler. – Thomas

Répondre

7
Select ResolvedBy, [Count], fiCategory, fiSubCategory, fiSymptom 
    , Avg(Z.Count) Over(Partition By fiCategory, fiSubCategory, fiSymptom) As AvgByGrp 
From (
     Select ResolvedBy, Count(*) As [Count], fiCategory, fiSubCategory, fiSymptom 
     From tContact 
     Group By ResolvedBy, fiCategory, fiSubCategory, fiSymptom 
     ) As Z 

Order By Z.Count Desc 
+1

+1, c'est luisant! –

+0

Il n'y a pas de colonne 'Count' et si je la change en' COUNT (*) 'je reçois une exception:" Impossible d'utiliser un agrégat ou une sous-requête dans une expression utilisée pour le groupe par une clause GROUP BY " –

+0

@ Tim Schmelter - Hm..Vous devrez le faire en utilisant une sous-requête. Va s'ajuster pour démontrer. – Thomas

2

Essayez ceci:

SELECT main.ResolvedBy, COUNT(*) AS Count, 
    main.fiCategory, main.fiSubCategory, main.fiSymptom, average 
FROM tContact main 
JOIN (SELECT COUNT(*)/count(distinct ResolvedBy) as average, 
     fiCategory, fiSubCategory, fiSymptom group by 2,3,4) x 
     on x.fiCategory = main.fiCategory 
     and x.fiSubCategory = main.fiSubCategory 
     and x.fiSymptom = main.fiSymptom 
WHERE main.ResolvedBy IS NOT NULL 
GROUP BY 1, 3, 4, 5 
ORDER BY 2 DESC 
+0

Je reçois un "Chaque expression GROUP BY doit contenir au moins une colonne qui n'est pas une référence externe". –

+0

+1 Je pense que Thomas l'a fait. Merci quand même :) –

Questions connexes