运行 基于指标列的总数,SQL 服务器

Running total based on indicator column, SQL Server

我想计算一个 运行 总数,当 FuelIndicator 从 NotReserve 切换到 Reserve 时,该总数加起来。谁能建议我如何实现这一目标?

FuelDate    FilledBy    KMSreading  FuelAmt FuelPrice   Vehicle         FuelIndicator
2017-04-12  Acb         34040       200     71.29       Suzuki GS150R   Reserve
2017-04-17  Acb         34142       200     71.29       Suzuki GS150R   Reserve
2017-04-20  Acb         34246_______200_____72.97_______Suzuki GS150R   Not Reserve
2017-04-24  Acb         34350_______200_____72.97_______Suzuki GS150R   Not Reserve
2017-04-28  Acb         34365_______100_____72.97_______Suzuki GS150R   Reserve
2017-04-30  Acb         34500       100     72.97       Suzuki GS150R   Reserve
2017-05-03  Acb         34620       250     75.20       Suzuki GS150R   Reserve

预期输出:

FuelDate    FilledBy    KMSreading  FuelAmt FuelPrice   Vehicle         FuelIndicator
2017-04-12  Acb         34040       200     71.29       Suzuki GS150R   Reserve
2017-04-17  Acb         34142       200     71.29       Suzuki GS150R   Reserve
2017-04-28  Acb         34365_______500_____72.97_______Suzuki GS150R   Reserve
2017-04-30  Acb         34500       100     72.97       Suzuki GS150R   Reserve
2017-05-03  Acb         34620       250     75.20       Suzuki GS150R   Reserve

谢谢,

您似乎想将 "not reserve" 与以下 "reserve" 结合使用。这似乎假设所有其他列都是相同的,除了燃料量、公里读数和日期。

您需要定义一个组。在这种情况下,困难的部分是在前面的 "not reserve" 中获得额外的 "reserve"。关键思想是对从每一行到数据末尾的 "reserve" 值的数量求和。此方法将按照您的需要分配组:

select t.*,
       sum(case when fuelindicator = 'Reserve' then 1 else 0 end) over (partition by vehicle order by fueldate desc) as grp
from t;

一旦我们有了分组,剩下的就是聚合:

select max(fueldate) as fueldate, FilledBy, max(KMSreading) as KMSreading,
       sum(FuelAmt) as fuelamt, FuelPrice, Vehicle,
       'Reserve' as fuelindicator
from (select t.*,
             sum(case when fuelindicator = 'Reserve' then 1 else 0 end) over (partition by vehicle order by fueldate desc) as grp
      from t
     ) t
group by FilledBy, FuelPrice, Vehicle ;