我的要求是在下面的图表中添加一行代表每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
答案 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
如果我误解了你的要求,请纠正我。