我有一个SQL Server表,其中包含燃油价格变化的记录。当燃油价格变化并且新记录被添加到表中并且更改日期和价格。我需要计算两个日期之间的最终燃油价格总和。在这个例子中,我想计算2014年12月1日到2014年12月31日之间的价格总和。
Fuel_Price | Change_Date
------------------------
16.50 | 01-01-2014
17.50 | 05-12-2014
17.25 | 15-12-2014
16.00 | 27-12-2014
修改
Total price = 16.50 * 5 (5-12-2014 - 1-12-2014) + 17.50 * 10 + 16 * 12 = 449,5
答案 0 :(得分:0)
这未经过测试,但您的查询应与此类似
SELECT SUM(
[current].Fuel_Price *
DATEDIFF ( DAY, [next].Change_Date, [current].Value ))
FROM
MyTable AS [current]
LEFT JOIN
MyTable AS [next]
ON [next].Change_Date= (SELECT MIN(Change_Date) FROM MyTable WHERE Change_Date> [current].Change_Date)
WHERE [current].Change_Date BETWEEN DATE1 AND DATE2
此查询如果我已理解将返回两个日期之间的价格总和(按日计算)
答案 1 :(得分:0)
我确信这不是最有效的方法,但它似乎可以解决问题。它使用3个步骤到达目的地:
ROW_NUMBER()
,以便每个日期的最新更改都是第一次。row_number()
= 1并将它们相加DECLARE @start DATE, @end DATE;
SELECT @start = '2014-12-01', @end = '2014-12-31';
;WITH dates AS
(
SELECT TOP (DATEDIFF(DAY, @start, @end) + 1)
theDate = dateadd(day, ROW_NUMBER() OVER (ORDER BY [object_id]) - 1, @start)
FROM sys.all_objects
),
allPrices as (
select d.theDate, fp.Fuel_Price, ROW_NUMBER() OVER (partition by theDate ORDER BY fp.Change_Date desc) rn
from dates d
inner join dbo.FuelPrices fp on d.theDate > fp.Change_Date
)
select sum(Fuel_Price) from allPrices where rn = 1
这给了我528.50。
如果您想查看每日价格,最后也可以select * from allPrices where rn = 1
。