【问题标题】:How to calculate percentage for sum of difference of two columns in sql如何计算sql中两列差异之和的百分比
【发布时间】:2017-06-09 11:58:56
【问题描述】:

我在同一张表中有两列,需要求和求差再计算百分比?

SELECT sum([BillCount]) - sum([IssueCount]) as [Difference]
FROM Invoice
where [Year] = '2015'

在上面的查询中,我得到的差值为 244234。现在我需要通过将差值除以实际的 Billcount 260918 来计算百分比。

样本数据:

SELECT sum(BillCount) as bills, sum(IssueCount) as issues
FROM Invoice
where [Year] = '2015'

结果: 账单:260918 问题:16684 差异:244234 除以实际账单:244234/260918 = 0.93 百分比:0.93*100 = 93.60

我使用了从零到一的更改除数。但是我得到了多行的百分比结果,比如每个单独的账单。有什么方法可以像我们在计算器中计算的那样在一行中获得确切的百分比? 谢谢。

【问题讨论】:

  • 您能否添加有问题的示例数据和预期结果

标签: sql sql-server


【解决方案1】:

像这样?

SELECT sum([BillCount]) - sum([IssueCount]) as [Difference],
    (sum(IssueCount) - sum(BillCount)) / nullif(sum(BillCount), 0) as ptcdiff
FROM Invoice
where [Year] = '2015'

你会注意到我改变了减法的顺序。这使得它是一个负面的变化,而不是一个积极的变化。如果你需要一个绝对的。改变,你可以在结果周围抛出 abs() 。如果有意义的话,您也可以将其烘焙到一个函数中

declare 
    @pctOld float = 260918,
    @pctNew float = 16684  

select PctDiff = case when @PctNew is null or @PctOld is null then null
                       when @PctNew = null or @PctOld = null then null
                       when @PctNew = 0 and @PctOld = 0 then 0    
                       when @PctNew = 0 and @PctOld > 0 then -100.00
                       when @PctNew >= 0 and @PctOld < 0 then null
                       when @PctNew < 0 and @PctOld > 0 then null
                       when @PctOld = 0 then null
                       else ((@PctNew - @PctOld) / abs(@PctOld)) * 100.0
                  end

【讨论】:

  • 需要多组括号,并且不能被零除,将默认除数改为1:SELECT sum([BillCount]) - sum([IssueCount]) as [Difference], (sum(IssueCount) - sum(BillCount)) / nullif(BillCount, 1)
  • 我可以得到总百分比吗?即,所有 Billcount 的总百分比? @Xedni
  • @Xedni,我将默认除数从零更改为一。
  • 我已经使用了从零到一的更改除数。但是我得到了多行的百分比结果,比如每个单独的账单。有什么方法可以像我们在计算器中计算的那样在一行中获得确切的百分比?
  • @CharlesBretana 这不是默认值;这是为了防止 div 零错误。
【解决方案2】:

这样的子查询

Select Difference/nullif(sum(BIllCount), 1) From (SELECT sum([BillCount]) - sum([IssueCount]) as [Difference],
FROM Invoice
where [Year] = '2015') Per

【讨论】:

    【解决方案3】:

    将当前表达式除以 SUM([BillCount]) 聚合值

    像这样的

    select (sum([BillCount]) - sum([IssueCount])) / NULLIF(sum([BillCount]),0) * 100
    FROM Invoice
    where [Year] = '2015'
    

    【讨论】:

      猜你喜欢
      • 2020-09-17
      • 1970-01-01
      • 1970-01-01
      • 2020-11-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多