Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/71.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 需要根据每个会计周计算平均成本_Sql_Sum_Average - Fatal编程技术网

Sql 需要根据每个会计周计算平均成本

Sql 需要根据每个会计周计算平均成本,sql,sum,average,Sql,Sum,Average,我希望有人能帮我解决这个问题,我正试图通过以下数据示例计算出每周平均值: Practice ID Cost FiscalWeek 1 10.00 1 1 33.00 2 1 55.00 3 1 18.00 4

我希望有人能帮我解决这个问题,我正试图通过以下数据示例计算出每周平均值:

    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语句设置每个星期,如下所示:

  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等,然后我使用第二个CTE对每周的列进行求和,例如,为了计算第6周的成本,我将使用以下代码:

    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中。我曾考虑过使用While..Loop,Cursor,但没有找到一种简单的方法。

我认为这会起作用:

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
为了

从第1周开始计算,或

SELECT SUM(t.cost)/(t1.fiscalweek - MIN(t.fiscalweek) + 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 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;

你可以将每周视为你想要的最终平均值的一个数据点。另一组每周根据后一周的点数加权。当几周的分数不同时,这些问题会产生非常不同的结果。

我希望所有问题都能解释清楚,格式优美!你是说你想要运行avg吗?我需要补充的一件事是,我需要考虑到财政周没有条目的情况,因此,例如,一项实践可能在第1周、第2周、第3周和第4周有成本,但在第5周没有成本,但继续进行第6周、第7周、第8周等。我需要计算8周而不是第7周的平均值,即使这意味着技术上第5周为零。我使用了上面的代码,因为我使用的是表变量,所以我被告知我需要将表声明为变量,即使它是变量,如果我使用与t相同的别名,那么我每周的每个练习都会得到相同的平均值。我更新了答案,以考虑到没有条目的财政周。我不明白你对这些表的问题,但我在代码中添加了另一个别名-看看它是否有效。谢谢你,这正是我想要的,我现在需要做的唯一一件事,我不确定如何为从表中选择的缺失周创建一些虚拟条目。基本上,如果有第1、2、3、7、9、10周的参赛作品,我如何以零成本获得缺失的第4、5、6、8周?如果这有道理的话。
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;