需要根据每个财政周计算平均成本

  • 本文关键字:计算 周计算 sql sum average
  • 更新时间 :
  • 英文 :


我希望有人可以帮助解决这个问题,这是我试图从以下数据示例中计算出每周的平均值:

    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周),那么您必须找到最低的全周数字。

另外,如果您要在多年进行计算,这将不起作用,但我认为这不是他的情况。

最新更新