首页 > 解决方案 > 如何在 SQL 中忽略运行总计/累计和中的 0?

问题描述

我希望我的 SQL 代码在运行总数中忽略 0。我正在尝试显示一个图表,FuelUsed/WH其中包含我们不希望显示的延迟之类的内容。我们有两个较早的选择语句,一个是工作时间到临时。另一个拉动另一个变量“使用的累计燃料”。这trackingbasisID <> 4将排除数据中的所有延迟。但是当这样做时,我们的数据会因延迟而下降到 0。然后我们在主选择语句中组合这些。(为了整个存储过程相当长的目的,我省略了代码的连接/批量)。

我们在折线图中显示它,所以它一直下降到零,我们希望代码忽略 0 并成为一条仅考虑高于零的数字/不包括延迟阶段的稳定线trackingbasis = 4。关于如何忽略 0 的任何线索?到目前为止,我的解决方案是在更下方的声明中创建它,以便将 0 转换为 Null,并且这种工作不会下降到 0,但它仍然看起来有点奇怪/不正确。

Select SUM(md.WorkHours) OVER
(ORDER BY md.date ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW )
AS CumulativeSumWorkHours INTO #CumulativeLoadData
FROM V_MechanicalDaily md
WHERE
md.ProjectNumber = @ProjectNumber
and md.PrimePhaseID in (SELECT Value FROM DredgeData.fn_Split(@PrimeP, ',')) 
and md.Date >= @BeginDate and md.Date <= @EndDate
and md.MeasureSystemID = md.ProjUOM

第二个临时表:

Select pltd.ProjectNumber, 
pltd.PrimePhaseNumber, 
pltd.date, 
pltd.PlantNumber,
pltd.FuelUsed as FuelUsed,
SUM(pltd.FuelUsed)
OVER (ORDER BY pltd.date ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW )
AS CumulativeSumFuelUsed,
AVG(pltd.FuelUsed)
OVER (ORDER BY pltd.date ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW )
AS CumulativeAvgFuelUsed
INTO #FuelUsedTable
from V_PLantDetail pltd
INNER JOIN V_ProjectPrimePhase p
on p.ProjectNumber = pltd.ProjectNumber
and p.PrimePhaseNumber = pltd.PrimePhaseNumber
and p.UnitOfMeasureID = pltd.MeasureSystemID
Where 
pltd.ProjectNumber = @ProjectNumber
and pltd.PrimePhaseID in (SELECT Value FROM DredgeData.fn_Split(@PrimeP, ','))
and pltd.PlantNumber = p.PlantNumber and date >=@BeginDate
and date <=@EndDate and pltd.SoftDelete <> 1 and p.TrackingBasisID <> 4

在主选择语句中:

fut.CumulativeSumFuelUsed / NULLIF (cum.CumulativeSumWorkHours,0)
AS CumulativeFuelUsedWH, '''

标签: sqlcumulative-sum

解决方案


推荐阅读