SQL Server 2008 R2 子查询分组、求和和计数

Posted

技术标签:

【中文标题】SQL Server 2008 R2 子查询分组、求和和计数【英文标题】:SQL Server 2008 R2 Subquery grouping, summing and count 【发布时间】:2014-02-20 20:26:27 【问题描述】:

我在数据库中有一个这样的表:

CREATE TABLE dbo.evals (
    [id] [int] IDENTITY(1,1) NOT NULL,
    [agent_id] [int] NOT NULL,
    [matrix_1] [int],
    [matrix_2] [int],
    [matrix_2] [int])

matrix_(x) 的每一列都有一个默认值 0。当经理正在评估代理时,不需要为每个矩阵输入一个条目。可以每天对代理进行评估。如果输入了一个矩阵,它将有一个介于 1 和 5 之间的值。如果不是,则为 0。我需要创建一个报告,对每个代理的每个矩阵求和和平均。在计算平均值时,我不需要计算 0 值,因此我需要以某种方式获取其中每个矩阵值 0 的计数。该报告不是一次针对一位座席,而是针对一份报告中的所有座席。我已经尝试使用带有子查询的 agent_id 进行一般组来获取矩阵 0 的矩阵计数,但它不起作用。我想结束的是这样的:

select agent_id, sum(matrix_1) / (count(matrix_1) where matrix_1 <> 0), 
          sum(matrix_2) / (count(matrix_2) where matrix_2 <> 0),
          sum(matrix_3) / (count(matrix_3) where matrix_3 <> 0)
group by agent_id

这只是说明所需结果的伪代码。我尝试使用子查询中的分组对每一列使用子查询,但这不起作用。

【问题讨论】:

【参考方案1】:

很好的问题吉姆!这应该这样做。如果您想要更好的平均值,请将您的值转换为 Avg 聚合的浮点数:

select
    agent_id,
    sum(matrix_1) Matrix1Sum,
    avg(case when matrix_1 > 0 then cast(matrix_1 as float) end) Matrix1Average,
    sum(matrix_2) Matrix2Sum,
    avg(case when matrix_2 > 0 then cast(matrix_2 as float) end) Matrix2Average,
    sum(matrix_3) Matrix3Sum,
    avg(case when matrix_3 > 0 then cast(matrix_3 as float) end) Matrix3Average
from evals
group by
    agent_id

【讨论】:

@ Ron Smith - 这正是我所需要的 - 非常适合我的要求 - 谢谢。

以上是关于SQL Server 2008 R2 子查询分组、求和和计数的主要内容,如果未能解决你的问题,请参考以下文章

更新表以按分组列显示总计 SQL Server 2008 R2

sql server 2008 r2 - 多列,每列都有因变量的总和

根据 SQL Server 2008 R2 中特定列中的模式更改对行进行分组

SQL Server 2008 R2 数据类型转换错误

sql 当前正在执行查询SQL Server 2008 R2

SQL Server 2008 R2:优化查询性能