如何划分SUM(CASE ...)es?

时间:2018-02-19 13:36:29

标签: sql sql-server

我需要通过划分两个SUM变量来获得百分比。但是当我尝试下面的代码时,它会给我0作为结果。如何划分这两个SUM?

谢谢!

(SUM(当FinalApprovalDt不为空时的情况和ContractPayoutAmt> 0然后1,否则0结束)/ SUM(当FinalApprovalDt不为空时为1,否则为0结束时的情况)* 100)作为WriteRate

3 个答案:

答案 0 :(得分:2)

SQL Server执行整数运算,因此1/2为0而不是0.5。

您可以使用case表达式中的非整数来写这个:

(SUM(Case when FinalApprovalDt is not null and ContractPayoutAmt > 0 Then 100.0 else 0 End) /
 SUM(Case when FinalApprovalDt is not null then 1 end)
) As WriteRate

请注意,我从分母中删除了else。这有助于防止被零除错误。

您也可以在没有明确划分的情况下将其写为:

AVG(Case when FinalApprovalDt is not null and ContractPayoutAmt > 0 Then 100.0 
         when FinalApprovalDt is not null then 0
    End) as WriteRate

这使用FinalApprovalDt非空的所有行的平均值,使用另一列的逻辑。

答案 1 :(得分:1)

强制其中一个DataSource=/sitecore/content/data/country sites&ExcludeTemplatesForDisplay=Country Site 表达式具有小数精度:

CASE

我怀疑SQL Server将两个1.0 * SUM(CASE WHEN FinalApprovalDt IS NOT NULL AND ContractPayoutAmt > 0 THEN 1 ELSE 0 END) / SUM(CASE WHEN FinalApprovalDt IS NOT NULL THEN 1 ELSE 0 END)* 100 AS WriteRate 表达式都视为整数。分割整数时,您可能会发生截断。因此,对于小于1的商,您只能看到零。

注意:我不知道你为什么要除以100.对于一个百分比,我希望你将分子乘以100。

答案 2 :(得分:0)

请尝试这样(使用1.0将分子的SUM加倍,使其成为小数,否则将得到整数除法。)

SUM(Case When FinalApprovalDt is not null and ContractPayoutAmt > 0 Then 1 else 0 End) * 1.0
     / SUM(Case when FinalApprovalDt is not null then 1 else 0 end) * 100.0 ) As WriteRate