我在为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
答案 0 :(得分:0)
我认为您的问题是整数除法。试试这个:
COALESCE( (b.BilledSupplies - b2.BilledSuppliesPreviousMonth) * 100.0 /
NULLIF(b2.BilledSuppliesPreviousMonth, 0), 0
)
相对于COALESCE()
,我更喜欢ISNULL()
(因为COALESCE()
是标准SQL)。但是,重要的变化是100.0
。这会将除法更改为使用小数点,因此1 / 2
是0.5
而不是0
。