简单的数学公式带回零/零

时间:2018-07-24 12:59:57

标签: sql sql-server-2012

我在为SQL中的简单公式而苦苦挣扎,但是事实证明这很困难,因为它会带回零/空值。

公式应将一个数字的差重新带到另一个数字

简单的一行是-

ISNULL ((b.BilledSupplies - b2.BilledSuppliesPreviousMonth) / nullif (b2.BilledSuppliesPreviousMonth, 0) * 100, 0) AS [BilledSuppliesDifference]

这在选择语法中如下所示

SELECT Isnull (b2.billedsuppliespreviousmonth, 0)                           AS 
       [BilledSuppliesPreviousMonth], 
       Isnull (( b.billedsupplies - b2.billedsuppliespreviousmonth ) / 
                       NULLIF (b2.billedsuppliespreviousmonth, 0) * 100, 0) AS 
       [BilledSuppliesDifference], 
       UnbilledSupplies = Isnull (u.unbilledsupplies, 0), 
       Isnull (u2.unbilledsuppliespreviousmonth, 0)                         AS 
       [UnbilledSuppliesPreviousMonth], 
       Isnull(( u.unbilledsupplies - u2.unbilledsuppliespreviousmonth ) / 
                     NULLIF (u2.unbilledsuppliespreviousmonth, 0) * 100, 1) AS 
       [UnbilledSuppliesDifference], 
       Isnull (Round(b.billedsupplies * 100.0 / 
                     ( b.billedsupplies + u.unbilledsupplies ), 1), 100.00) AS 
       [PercentageBilled]  

如果我们从上方提取原始行-ISNULL ((b.BilledSupplies - b2.BilledSuppliesPreviousMonth) / nullif (b2.BilledSuppliesPreviousMonth, 0) * 100, 0) AS [BilledSuppliesDifference]-这是从以下行开始

Unbilled AS
(   SELECT  c.CreatedDate
            --s.ProfileClass
            --c.BillingTier
            ,FromDate = MIN(c.FromDate)
            ,ToDate = MAX(c.ToDate)
            ,Days = SUM(DATEDIFF(DAY, c.FromDate, c.ToDate) + CONVERT(INT, c.FirstCharge))
            ,EAC = MAX(c.EstimatedAnnualConsumption)
            ,Kwh = SUM((DATEDIFF(DAY, c.FromDate, c.ToDate) + CONVERT(INT, c.FirstCharge)) * c.EstimatedAnnualConsumption / 365.0)
            --,UnbilledSupplies = COUNT(DISTINCT s.ElectricitySupplyID)
            ,UnbilledSupplies = isnull(COUNT(DISTINCT s.ElectricitySupplyID), 0)



     FROM   Sinq.staging.StandingChargeArchive c
            INNER JOIN Sinq.dbo.ElectricitySupply s
                ON s.ElectricitySupplyID = c.ElectricitySupplyID

    WHERE c.CreatedDate >= DATEADD(MONTH, -13, CAST(GETDATE() AS DATE))

    GROUP BY c.CreatedDate --,s.ElectricitySupplyID
    --s.ProfileClass, c.BillingTier
),

Unbilled2 AS 
(
Select * , LAG(UnbilledSupplies) OVER(ORDER BY CreatedDate) AS UnbilledSuppliesPreviousMonth
FROM Unbilled
)

对于未开票的耗材,它会返回以下内容,例如-7.582938

0   0   1
0   0   1
0   0   1
0   0   1
211 0   1
195 211 0
180 195 0
218 180 0
281 218 0
315 281 0
206 315 0
69  206 0
38  69  0

1 个答案:

答案 0 :(得分:0)

我认为您的问题是整数除法。试试这个:

COALESCE( (b.BilledSupplies - b2.BilledSuppliesPreviousMonth) * 100.0 / 
          NULLIF(b2.BilledSuppliesPreviousMonth, 0), 0
        )

相对于COALESCE(),我更喜欢ISNULL()(因为COALESCE()是标准SQL)。但是,重要的变化是100.0。这会将除法更改为使用小数点,因此1 / 20.5而不是0