我有按年和子组设置的学校毕业数据,并提供了分子和分母以及单年毕业率,但我还需要计算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
任何建议将不胜感激,但请为此新手提供建议。 感谢您的时间和帮助。
答案 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”之后放置了空值...您可以选择默认值。