我希望有人可以帮助解决这个问题,这是我试图从以下数据示例中计算出每周的平均值:
Practice ID Cost FiscalWeek
1 10.00 1
1 33.00 2
1 55.00 3
1 18.00 4
1 36.00 5
1 24.00 6
13 56.00 1
13 10.00 2
13 24.00 3
13 30.00 4
13 20.00 5
13 18.00 6
我想要的是按实践ID进行分组,但要确定每种练习的平均值(其中有500多个不仅是上面的练习),并每周都会解决此问题,因此例如,在第1周就没有平均值,但第2周将是第1周和第2周的平均值,然后第3周将是第1、2和3周的平均值,然后是依此类推。然后,我需要通过练习ID和每个会计周来显示此内容。
目前我有一些不漂亮的代码,必须有一种更简单的方法,此代码是:
我将所有数据传递到表变量,然后使用CTE,然后使用案例语句设置每个单个星期,例如:
CASE WHEN fiscalweek = 1 THEN cost ELSE 0 END AS [1],
CASE WHEN fiscalweek = 2 THEN cost ELSE 0 END AS [2],
CASE WHEN fiscalweek = 3 THEN cost ELSE 0 END AS [3]
这将使第1周的成本等等,依此类推,例如1,2,3等
sum([1]) as 'Average Wk 1',
sum([1]+[2])/2 as 'Average Wk 2',
sum([1]+[2]+[3])/3 as 'Average Wk 3',
sum([1]+[2]+[3]+[4])/4 as 'Average Wk 4',
sum([1]+[2]+[3]+[4]+[5])/5 as 'Average Wk 5'
sum([1]+[2]+[3]+[4]+[5]+[6])/6 as 'Average Wk 6'
我已经考虑了在T-SQL中准确地计算出该平均值的各种不同方法,因此我最终可以将其放入SSR中。我考虑过一段时间。
您正在寻找平均值的累积平均值。在支持窗口/分析函数的数据库中,您可以执行:
select fiscalweek, avg(cost) as avgcost,
avg(avg(cost)) over (order by fiscalweek) as cumavg
from practices p
group by fiscalweek
order by 1;
如果您没有窗口功能,则需要使用某种形式的相关子查询或加入:
select p1.fiscalweek, avg(p1.avgcost)
from (select fiscalweek avg(cost) as avgcost
from practices p
group by fiscalweek
) p1 join
(select fiscalweek avg(cost) as avgcost
from practices p
group by fiscalweek
) p2
on p12 <= p1
group by p1.fiscalweek
order by 1;
我确实想警告您您正在计算"平均值"。这与累积平均值不同,可以计算为:
select fiscalweek,
(sum(sum(cost)) over (order by fiscalweek) /
sum(count(*)) over (order by fiscalweek)
) avgcost
from practices p
group by fiscalweek
order by 1;
一个人每周都将一个数据点视为最终平均水平的一个数据点(您似乎想要的是)。其他每周的权重在一周内的点数(后一个解决方案)。当几周数量不同时,这些结果可能会产生非常不同的结果。
我不知道我是否完全理解这个问题:但是尝试执行此问题:应该帮助您:
create table #practice(PID int,cost decimal,Fweek int)
insert into #practice values (1,10,1)
insert into #practice values (1,33,2)
insert into #practice values (1,55,3)
insert into #practice values (1,18,4)
insert into #practice values (1,36,5)
insert into #practice values (1,24,6)
insert into #practice values (13,56,1)
insert into #practice values (13,10,2)
insert into #practice values (13,24,3)
insert into #practice values (13,30,4)
insert into #practice values (13,20,5)
insert into #practice values (13,18,6)
select * from #practice
select pid,Cost,
(select AVG(cost) from #practice p2 where p2.Fweek <= p1.Fweek and p1.pid = p2.pid) WeeklyAVG,
Fweek,AVG(COST) over (Partition by PID) as PIDAVG
from #practice p1;
我认为这会起作用:
SELECT t1.pid,
t1.fiscalweek,
(
SELECT SUM(t.cost)/COUNT(t.cost)
FROM tablename AS t
WHERE t.pid = t1.pid
AND t.fiscalweek <= t1.fiscalweek
) AS average
FROM tablename AS t1
GROUP BY t1.pid, t1.fiscalweek
编辑
要考虑到没有进入的财政周,您可以简单地交换
SELECT SUM(t.cost)/COUNT(t.cost)
SELECT SUM(t.cost)/t1.fiscalweek
从第1周或
计算SELECT SUM(t.cost)/(t1.fiscalweek - MIN(t.fiscalweek) + 1)
从本练习的第一周开始计算。
如果所有练习平均值都应在同一周开始(并且不一定是第1周),那么您必须找到最低的全周数字。
另外,如果您要在多年进行计算,这将不起作用,但我认为这不是他的情况。