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

时间:2014-02-20 20:26:27

标签: sql tsql sql-server-2008-r2 ssrs-2008

我在数据库中有一个表格,如下所示:

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 个答案:

答案 0 :(得分:4)

好问题吉姆!这应该做到这一点。如果您想要更好的平均值,请将您的值转换为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