Sql 按列分组+;计数(*),如何获得每个组合的平均计数?
我有以下(简化)问题: 现在我需要Sql 按列分组+;计数(*),如何获得每个组合的平均计数?,sql,sql-server,sql-server-2005,group-by,Sql,Sql Server,Sql Server 2005,Group By,我有以下(简化)问题: 现在我需要fiCategory、fiSubCategory、fiSymptomas列的每个组合的平均计数。怎么做 例如: ResolvedBy Count fiCategory fiSubCategory fiSymptom Average 1 50 1 2 3 40 2 30 1
fiCategory、fiSubCategory、fiSymptom
as列的每个组合的平均计数。怎么做
例如:
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,3
和2,3,4
。因此,计算了两个平均值:
的此组合的所有发生次数的总和
提前谢谢。试试这个:
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
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
为了帮助确定解决方案,您是如何得出平均值的?您是指使用显示的数据得出的平均值吗?也就是说,fiCategory的平均值为(1+1+1+2+2)/5=1.4?这也可能有助于了解您预期的输出结果。在本例中,fiCategory、fiSubCategory和fiSymptom有两种组合:1,2,3和2,3,4。因此,计算了两个平均值:1.combi=>50+30+40/3和2.combi=>20+40/2。因此,我想对每个组合的计数求和,并除以发生数。我得到一个“每个GROUP BY表达式必须至少包含一个非外部引用的列”。没有列count
,如果我将其更改为count(*)
,我会得到一个异常:“不能在group by子句的group by列表所用的表达式中使用聚合或子查询“@Tim Schmelter-Hm..你必须使用子查询来完成。将进行调整以进行演示。请尝试通过
从组中删除计数
。我为Thomas添加了它,认为这是一个基于他在SELECT
中如何使用它的专栏,但我可能做的坏事多于好事:(@Abe Miessler-我相信你必须先在派生表中运行计数,才能得到每组的计数。然后你可以对该结果进行平均。@Abe:也感谢你的工作和时间。它给出了正确的结果。令人印象深刻的是,人们可以在不知道确切要求和数据的情况下理解并解决这个问题。
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