用空值计算移动平均值

时间:2019-06-14 22:15:03

标签: sql tsql null moving-average divide-by-zero

我有按年和子组设置的学校毕业数据,并提供了分子和分母以及单年毕业率,但我还需要计算3年移动平均值。一位统计学家的建议是,我不再与我们合作,要做到这一点,我需要获得分子的3年累计值和分母3年的累计值。我了解其背后的数学原理,并通过手工和excel与几个小组一起检查了我的工作。只要没有空记录,我也可以使用T-SQL进行此计算,但是当存在空值或0时,我正在努力进行计算。

我尝试使用NULLIF运行查询为空的查询

   ID,
   Bldg,
   GradClass,
   Sbgrp ,
   TGrads,
   TStus,
   Rate,
/*Numerator Running total*/
   SUM (TGrads) OVER ( partition BY ID, Sbgrp ORDER BY GradClass ROWS BETWEEN 2 preceding AND CURRENT row ) AS NumSum,
/*Denominator Running Total*/
   SUM ( TStus) OVER ( partition BY ID, Sbgrp ORDER BY GradClass ROWS BETWEEN 2 preceding AND CURRENT row ) AS DenSum,
/*Moving Year Average*/
   (
       ( SUM ( TGrads) OVER ( partition BY DistrictID, Sbgrp ORDER BY GradClass ROWS BETWEEN 2 preceding AND CURRENT row ) ) / NULLIF ( ( SUM ( TStus) OVER ( partition BY ID, Sbgrp ORDER BY GradClass ROWS BETWEEN 2 preceding AND CURRENT row ) ), 0 ) * 100 
   ) AS 3yrAvg 
FROM
   KResults.DGSRGradBldg

第一个问题,向我提供了所有子分组的记录,即使这些子分组中没有学生也是如此。我想保留记录,以便所有子组都包含在区域中,并且由于我知道他们没有数据,我可以用0替换Tgrads,TStus中的Null值吗?如果我确实将这些值替换为0,如何将利率显示为空?

第二个问题,如何使用分母为0或0的分母来计算利率?我们了解您无法将其除以0,但我想保留该记录,因此很容易看出他们没有数据。我怎样才能做到这一点?当我尝试在不考虑Null的情况下计算此值时,我得到了错误:1.)除以零错误。 (8134)和2.)空值通过聚合或其他SET运算消除。 (8153)。

知道无法将其除以0或Null时,我将查询修改为包括NULLIF,当查询成功时,查询没有错误,但对于低于100%的费率,我无法获得准确的百分比。我的所有汇率现在都是100%或0-请注意最后一行,2/3的移动平均值不是0。

如果我尝试将空值考虑在内,那么数据将是这样,三年移动平均值显示为0。请注意,“三年移动平均值”列显示所有0。

ID   Bldg    Class   Sbggrp  TGrads  TStus      Rate    NumSum DenSum  3yrAvg  
A    1      2014       A1    46      49         93.9    46     49       0
A    1      2015       A1    41      46         89.1    87     95       0
A    1      2016       A1    47      49         95.9    134    144      0
A    1      2017       A1    38      40         95.0    126    135      0
A    1      2018       A1    59      59         98.3    143    148      0
A    1      2014       A2    1       1          100     1      1        100
A    1      2015       A2                               1      1        100
A    1      2016       A2                               1      1        100
A    1      2017       A2    2       3          66.7    2      3        0
A    1      2018       A2    2       2          100     4      5        0

任何建议将不胜感激,但请为此新手提供建议。 感谢您的时间和帮助。

1 个答案:

答案 0 :(得分:0)

问题1的答案:处于选择条件

ISNULL(TGrads,0) AS TGRADS,
ISNULL(TStus,0) AS TSTUS,

问题2的答案:我会这样做

(CASE WHEN SUM(TStus) OVER ( partition BY ID, Sbgrp ORDER BY GradClass ROWS BETWEEN 2 preceding AND CURRENT row ) IS NOT NULL
AND SUM(TStus) OVER ( partition BY ID, Sbgrp ORDER BY GradClass ROWS BETWEEN 2 preceding AND CURRENT row ) <>0
THEN (SUM(TGrads) OVER ( partition BY DistrictID, Sbgrp ORDER BY GradClass ROWS BETWEEN 2 preceding AND CURRENT row )  / (SUM(TStus) OVER ( partition BY ID, Sbgrp ORDER BY GradClass ROWS BETWEEN 2 preceding AND CURRENT row ) ) ) * 100
ELSE NULL END
   ) AS 3yrAvg 

我在“ ELSE”之后放置了空值...您可以选择默认值。