计算SQL Server结果集中不同日期之间的更改总价

时间:2014-12-16 15:17:26

标签: sql-server

我有一个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

2 个答案:

答案 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个步骤到达目的地:

  1. 使用CTE根据How to generate a range of dates in SQL Server中的提示构建范围内所有日期的列表。
  2. 将日期列表加入到您的表中,但仅匹配过去的日期。使用ROW_NUMBER(),以便每个日期的最新更改都是第一次。
  3. 仅挑选最新的更改,其中row_number() = 1并将它们相加
  4. 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