2011-08-05 62 views
4

我有以下(简化)查询:按列+ COUNT(*)分组,如何获得每个组合的平均计数?

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 

现在我需要为每fiCategory, fiSubCategory, fiSymptom组合柱的平均计数。怎么做?

例如:

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 

在该示例中是fiCategory,fiSubCategory和fiSymptom的两种组合:1,2,32,3,4和。因此存在被计算的两个平均值:

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

所以想要总结的每计数组合并划分出现的次数。

编辑:该示例是提取所需的查询结果。计数是每个ResolvedBy这个组合的所有出现的总和。

预先感谢您。

+1

为了帮助确定一个解决方案,你怎么在平均到达? – RobB

+0

您的意思是使用显示的数据的平均值?即,fiCategory的平均值将是(1 + 1 + 1 + 2 + 2)/ 5 = 1.4? – Thomas

+0

它也可能有助于查看您期望的输出结果。 – Thomas

回答

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,这是光滑的! –

+0

没有列'Count',如果我将其更改为'COUNT(*)',我得到一个异常:“不能在用于GROUP BY子句列表的组的表达式中使用聚合或子查询” –

+0

@蒂姆Schmelter - 嗯..你必须使用子查询。将调整来演示。 – Thomas

2

试试这个:

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

我得到一个“每个GROUP BY表达式都必须包含至少一个不是外部引用的列”。 –

+0

+1我认为托马斯做到了。不管怎样,谢谢你 :) –