运行 基于指标列的总数,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 ;
我想计算一个 运行 总数,当 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 ;