3

我有一个如下所示的数据集:

  User  |  Task  |  Time
--------|--------|--------
 User A | Task X |  100
 User A | Task Y |  200
 User A | Task Z |  300
 User B | Task X |  400
 User B | Task Y |  500
 User B | Task Z |  600
 User C | Task X |  700
 User C | Task Y |  800
 User C | Task Z |  900
 User D | Task X | 1000
 User D | Task Y | 1100
 user D | Task Z | 1200

当我进行初始分组时,数据如下所示:

       | Avg User | Avg Task X | Avg Task Y | Avg Task Z
  User |   Time   |    Time    |    Time    |    Time   
-------|----------|------------|------------|------------
User A |    200   |    100     |    200     |    300
User B |    500   |    400     |    500     |    600
User C |    800   |    700     |    800     |    900
User D |   1100   |   1000     |   1100     |   1200

我需要它看起来像这样:

      | Avg User | Avg Task X | Avg Task Y | Avg Task Z
 User |   Time   |    Time    |    Time    |    Time   
------|----------|------------|------------|------------
 All  |    650   |    550     |    650     |    750

这就是我得到这些数字的方式:

 650 = (200+500+800+1100) / 4
 550 = (100+400+700+1000) / 4
 650 = (200+500+800+1100) / 4
 750 = (300+600+900+1200) / 4

换句话说,我在Task上有一个列组,在User上有一个行组。问题是我希望行组得到额外的时间总结。

乍一看,我可以将用户名返回为“全部”,它会进行总结,但这实际上并没有给我所需的平均值。我需要先按用户求和,然后找到每个用户的平均值。如果我改变原始数据的形成方式,我的任务组将不再正常工作。

如果我尝试在我的行组上使用“总计”行,它会聚合原始数据而不是汇总/分组数据。这相当令人失望,因为在我看来它实际上是不正确的。

4

4 回答 4

1

我能够执行此类功能的唯一方法是使用报告的代码部分。我将跟踪我想在全局变量中汇总的组数据,以便稍后输出到我想要的字段。

这是一篇描述如何将代码嵌入到报告中的微软文章 http://msdn.microsoft.com/en-us/library/ms159238.aspx

这是解决您的问题的更详细的方法。 关联

于 2011-12-29T20:26:40.010 回答
0

假设您的源是 SQL Server 2008,您可能可以使用分组集的组合:

http://technet.microsoft.com/en-us/library/bb522495.aspx

和 SSRS 聚合函数:

http://msdn.microsoft.com/en-us/library/ms155830(v=sql.90).aspx

这个博客有一个例子,可能也有帮助

http://beyondrelational.com/blogs/jason/archive/2010/07/03/aggregate-of-an-aggregate-function-in-ssrs.aspx

祝你好运

于 2011-12-31T06:59:38.900 回答
0

我会在 sql 脚本中执行此操作,在报告中执行此操作将是矫枉过正(尽管它可能是可能的)。

我在这里有示例脚本:

drop table #tmp, #tmp2, #tmp3

select 'User A' as [User],' Task X ' as [Task],100.00 as [Time]
into #tmp
union all 
select 'User A ',' Task Y ',200
union all 
select 'User A ',' Task Z ',300
union all
select 'User B ',' Task X ',400
union all 
select 'User B ',' Task Y ',500
union all 
select 'User B ',' Task Z ',600
union all 
select 'User C ',' Task X ',700
union all 
select 'User C ',' Task Y ',800
union all 
select 'User C ',' Task Z ',900
union all 
select 'User D ',' Task X ',1000
union all 
select 'User D ',' Task Y ',1100
union all 
select 'User D ',' Task Z ',1200

select [User],
   Task,
   Sum(time) as time
into #tmp2
from #tmp
group by [User],
   [Task]

select [User],
   avg(time) as time
into #tmp3
from #tmp2
group by [User];

declare @statement nvarchar(max);
select @statement = 
'with cteTimes as (
   select * 
   from #tmp2 t
      pivot (sum (t.[time]) for Task in (' + stuff((select ', ' + quotename([Task]) from #tmp group by [Task] for xml path, type).value('.','varchar(max)'), 1, 2, '') + ')) as Task
)
select ''All'' as [User],
   (select avg(usr.time) from #tmp3 usr),'
 + stuff((select ', avg(' + quotename([Task]) + ') as ' + quotename([Task]) from #tmp group by [Task] for xml path, type).value('.','varchar(max)'), 1, 2, '') + 
 +'from cteTimes x ';

exec sp_executesql @statement;

在创建#tmp4 时,可以通过使用枢轴而不是多个连接来优化该脚本。我的例子只是解释性的。

于 2011-12-30T12:44:23.243 回答
0

这是我要编写的有效查询...“PreQuery”用于对给定用户的每个元素的计数和总和进行分组...然后将其汇总到“All”的最顶层。现在,这是基于您的数据样本。

SELECT
    AVG( TaskTime / TaskCount ) as TaskAvg,
    SUM( XTime ) / SUM( XCount ) as XAvg,
    SUM( YTime ) / SUM( YCount ) as YAvg,
    SUM( ZTime ) / SUM( ZCount ) as ZAvg
   from 
      ( SELECT 
              user,
              COUNT(*) as TaskCount,
              SUM( Time ) as TaskTime,
              CASE WHEN Task = "Task X" THEN 1 ELSE 0 END as XCount,
              CASE WHEN Task = "Task X" THEN Time ELSE 0 END as XTime,
              CASE WHEN Task = "Task Y" THEN 1 ELSE 0 END as YCount,
              CASE WHEN Task = "Task Y" THEN Time ELSE 0 END as YTime,
              CASE WHEN Task = "Task Z" THEN 1 ELSE 0 END as ZCount,
              CASE WHEN Task = "Task Z" THEN Time ELSE 0 END as ZTime
           FROM 
              AllUsersTasks
           group by ;
              user ) PreQuery

如果您的数据可以提供给定用户对单个任务有多个条目,例如用户 A 有 3 个条目,任务 X 的时间为 95、100 和 105,那么您有 300 个条目,结果为 100。这可能歪曲您对该任务的总体平均水平,并且必须修改查询。让我知道一个人是否会根据生产数据对每个给定任务有多个条目......如果是这样,那么可能需要将该元素放入其 OWN 预查询中,其中“来自 AllUserTasks”表是。

于 2012-01-03T16:07:34.970 回答