生成旋转平均值

时间:2014-08-06 21:53:05

标签: sql sql-server-2008 reporting-services ssrs-2008

我的要求是在下面的图表中添加一行代表每8周的平均值,这将在整个报告中多次使用。在这一点上,我拉出我的头发,想要把它弄出来。到目前为止,我一直使用临时表,一次循环8周的数据,根据这8周计算平均值,将这些值插入到lut中,加入我的proc中的表,然后通过SSRS。它不是很易维护,很多丑陋的代码,而且我确信在此过程中会有一些性能点击,尽管不是我最关心的问题。

以下是一些示例数据:

region     yearnbr    weeknbr     value
A          2014       1           32
A          2014       2           77
A          2014       3           102
A          2014       4           84
A          2014       5           90
A          2014       6           90
A          2014       7           79
A          2014       8           103
A          2014       9           107
A          2014       10          110
A          2014       11          85
A          2014       12          120
A          2014       13          83
A          2014       14          79
A          2014       15          91
A          2014       16          101
A          2014       17          102
A          2014       18          103
A          2014       19          106
A          2014       20          95

... 

基本上,我要做的是添加另一个字段,该字段将考虑每个区域8周轮换的平均值,然后使用SSRS图表中的该字段生成具有其所尊重值的平均值。以下是我所追求的一个例子。如果有更好的解决方案,我很乐意听到......在这个例子中,我们假设我们在第20周。

region     yearnbr    weeknbr     value     average
A          2014       1           32         82
A          2014       2           77         82
A          2014       3           102        82
A          2014       4           84         82
A          2014       5           90         82
A          2014       6           90         82
A          2014       7           79         82
A          2014       8           103        82
A          2014       9           107        97
A          2014       10          110        97
A          2014       11          85         97
A          2014       12          120        97
A          2014       13          83         97
A          2014       14          79         97
A          2014       15          91         97
A          2014       16          101        97
A          2014       17          102        102
A          2014       18          103        102
A          2014       19          106        102
A          2014       20          95         102

... 

任何建议或帮助将不胜感激。感谢。

详细说明:
SQL Server 2008 R2
SSRS

3 个答案:

答案 0 :(得分:1)

在SQL Server 2005及以上版本中就是这么简单:

SELECT
   D.*,
   Average8weeks =
      Avg(D.value * 1.0) -- multiply by 1.0 if you don't want only integers
      OVER (PARTITION BY D.region, D.yearnbr, (D.weeknbr - 1) / 8)
FROM
   #Data D -- or whatever your table or query is
;

如果您使用的是SQL Server 2000或更早版本,请告知我们。

以下是试用数据的设置脚本:

SELECT *
INTO #Data
FROM
   (VALUES
      ('A', 2014, 1, 15),
      ('A', 2014, 2, 30),
      ('A', 2014, 3, 25),
      ('A', 2014, 4, 45),
      ('A', 2014, 5, 15),
      ('A', 2014, 6, 30),
      ('A', 2014, 7, 25),
      ('A', 2014, 8, 45),
      ('A', 2014, 9, 10),
      ('A', 2014, 10, 54),
      ('B', 2014, 1, 63),
      ('B', 2014, 2, 10),
      ('B', 2014, 3, 54),
      ('B', 2014, 4, 63),
      ('B', 2014, 5, 54),
      ('B', 2014, 6, 63),
      ('B', 2014, 7, 54),
      ('B', 2014, 8, 63),
      ('B', 2014, 9, 54),
      ('B', 2014, 10, 63)
   ) D (region, yearnbr, weeknbr, value)
;

答案 1 :(得分:0)

如果我正确理解你的问题,你的输出会在同一个Y轴上显示两个线图,一个是每周数据,另一个是步长函数,前8周的值是第1周的平均值8,等等,对吗?

如果是这种情况,则为第二个系列创建第二组记录,并将两个系列组合成一个数据集,然后在SSRS中将它们绘制为两个系列共享同一轴的折线图。

答案 2 :(得分:0)

如果您希望结果集在一组中返回8个值的平均值,则下面的代码将为您提供所需的结果:

;WITH CTE AS (

 SELECT * FROM
   (VALUES
      ('A', 2014, 1, 32.00),
      ('A', 2014, 2, 77.00),
      ('A', 2014, 3, 102.00),
      ('A', 2014, 4, 84.00),
      ('A', 2014, 5, 90.00),
      ('A', 2014, 6, 90.00),
      ('A', 2014, 7, 79.00),
      ('A', 2014, 8, 103.00),
      ('A', 2014, 9, 107.00),
      ('A', 2014, 10, 110.00),
      ('A', 2014, 11, 85.00),
      ('A', 2014, 12, 120.00),
      ('A', 2014, 13, 83.00),
      ('A', 2014, 14, 79.00),
      ('A', 2014, 15, 91.00),
      ('A', 2014, 16, 101.00),
      ('A', 2014, 17, 102.00),
      ('A', 2014, 18, 103.00),
      ('A', 2014, 19, 106.00),
      ('A', 2014, 20, 95.00)
   ) D (region, yearnbr, weeknbr, value))

 SELECT Region, yearnbr, (weeknbr-1)/8+1 Week, CAST(SUM(value)/8 AS FLOAT) AVG FROM CTE
 GROUP BY Region, yearnbr, (weeknbr-1)/8

如果我误解了你的要求,请纠正我。