计算两个值之间的百分比

时间:2018-08-23 05:05:24

标签: sql sql-server-2016 percentage

我有两列保存的数字是我要计算的百分比之间的差异,并在另一列中显示结果,但是结果似乎是错误的。

这是有问题的代码。

SELECT 
    GenPar.ParameterValue AS ClaimType,
    COUNT(Submitted.ClaimNumber) AS SubmittedClaims,
    COUNT(ApprovalProvision.ClaimNumber) AS ApprovedClaims,
    COUNT(Declined.ClaimNumber) AS DeclinedClaims,
    COUNT(Pending.ClaimNumber) AS PendingClaims,
    ISNULL(SUM(SubmittedSum.SumInsured),0) AS TotalSubmittedSumInsured,
    ISNULL(SUM(ApprovedSum.SumInsured),0) AS TotalApprovedSumInsured,
    ISNULL(SUM(RejectedSum.SumInsured),0) AS TotalRejectedSumInsured,
    ISNULL(SUM(PendingSum.SumInsured),0) AS TotalPendingSumInsured,
    --This column is to show the diff in %
    CASE WHEN COUNT(Submitted.ClaimNumber) <> 0 AND COUNT(ApprovalProvision.ClaimNumber) <> 0
         THEN (COUNT(ApprovalProvision.ClaimNumber),0) - (COUNT(Submitted.ClaimNumber),0)
              /COUNT(Submitted.ClaimNumber) * 100
         ELSE 0
         END

我需要的是显示SubmittedClaims和ApprovedClaims列之间的百分比差异。任何列,或两者都可以包含零,也可以不包含零。

因此,据我所知:COUNT(Submitted.ClaimNumber)-COUNT(ApprovalProvision.ClaimNumber)/ COUNT(Submitted.ClaimNumber)* 100据我所知。

我已经尝试过了,它的一个例子是,当1和117之间的差减少了99.15%时,它需要1和117并返回17。另一个示例是2和100。这仅返回0,而差是减少98%。

CASE WHEN COUNT(Submitted.ClaimNumber) <> 0 AND COUNT(ApprovalProvision.ClaimNumber) <> 0
         THEN (COUNT(ApprovalProvision.ClaimNumber),0) - (COUNT(Submitted.ClaimNumber),0)
              /COUNT(Submitted.ClaimNumber) * 100
         ELSE 0
         END

我检查了此链接,这似乎是我在做什么。

Percentage difference between two values

我也尝试过以下代码:

NULLIF(COUNT(Submitted.ClaimNumber),0) - NULLIF(COUNT(ApprovalProvision.ClaimNumber),0) 
    / NULLIF(COUNT(Submitted.ClaimNumber),0) * 100

以2和100为例,当实际差异减少98%时返回-4998。

为完成起见,Submitted.ClaimNumber是这部分代码:

LEFT OUTER JOIN (SELECT * FROM Company.Schema.ClaimMain WHERE CurrentStatus=10)Submitted
ON Submitted.ClaimNumber = ClaimMain.ClaimNumber

ApprovalProvision.ClaimNumber是这样的:

LEFT OUTER JOIN (SELECT * FROM Company.Schema.ClaimMain WHERE CurrentStatus=15)ApprovalProvision
ON ApprovalProvision.ClaimNumber = ClaimMain.ClaimNumber

理想情况下,此列也将处理0。因此,如果一个值为0,另一个为X,则结果应返回0,因为如果原始数为0,则无法计算百分比。如果原始值为X,而新值为0,则我应显示减少100%。

这将在所有列上发生,但由于所有计算都将以相同的方式进行,因此无需用其余列填充页面。

有人看到我在做什么错吗?

1 个答案:

答案 0 :(得分:1)

我不熟悉为什么使用(x,0)作为语法

但是我看到你有

(COUNT(ApprovalProvision.ClaimNumber),0) - (COUNT(Submitted.ClaimNumber),0)
              /COUNT(Submitted.ClaimNumber) * 100

应该不是,

( COUNT(ApprovalProvision.ClaimNumber) - COUNT(Submitted.ClaimNumber) )
              /COUNT(Submitted.ClaimNumber) * 100

看起来好像要对ApprovalProvision.ClaimNumber进行计数-自提交以来。ClaimNumber为100。声明数本身除以1乘以100即得到100。

4900号码实际上听起来正确。让我们以下面的示例为例,您有2个苹果,然后又得到98个,得到100个苹果。

如果增加2个苹果,则意味着增加98%,您将拥有3.96个苹果。

增加100%表示从2个苹果开始,您以4个苹果结束。增加1000%意味着从2个苹果开始,您将获得22个苹果。因此4000%表示您以82个苹果结束。 5000%表示来自2个苹果,您可以达到102个苹果。

(100-2)/ 2 * 100 = 98/2 = 49 * 100 = 4900,所以如果您从2个苹果开始并达到100个,则苹果数量似乎增加了4900%。

现在,如果您将2和100进行了翻转,例如从100开始,那么现在有2, (2-100)/ 100 * 100 = -98,所以苹果变了-98%,下降了98%。

希望这可以解决您的问题。