0

使用的版本:Microsoft SQL Server Management Studio、SQL Server 2008

我面临一个由不对称列引起的令人沮丧的问题。基本上,我想计算折扣对给定现货价格的影响。两者都设置为同一个表 pricevalues中的索引。现货价格每周 5 天提供,而折扣仅在更新当天说明。因此,例如:

价格值(价格指数,价格,价格日期)

     PRICEINDEX             PRICE            PRICEDATE              
-------------------- ------------------ ------------------
DISCOUNT_INDEX_ID   |       15.5       |    2013-02-26
DISCOUNT_INDEX_ID   |       10.5       |    2013-04-05
DISCOUNT_INDEX_ID   |       16.0       |    2013-07-10
SPOT_INDEX_ID       |       356.5      |    2013-07-22
SPOT_INDEX_ID       |       355.0      |    2013-07-23
SPOT_INDEX_ID       |       354.6      |    2013-07-24
SPOT_INDEX_ID       |       357.0      |    2013-07-25
SPOT_INDEX_ID       |       358.5      |    2013-07-26

如果要使用最新给出的(相对于现货价格的 PRICEDATE)折扣 PRICE,我将如何最好地计算 SPOT_INDEX_ID 给出的所有日期的 SPOT_INDEX_ID 和 DISCOUNT_INDEX_ID 的 PRICE 之间的差异?

例如,2013-07-22 的现货折扣为16.0(2013-07-10),而 2013-05-15 的现货折扣为10.5(2013-04-05), 2013-03-03 上的现货是15.5 (2013-02-26)

我只知道当 PRICEDATE 匹配 DISCOUNT_INDEX_ID 和 SPOT_INDEX_ID 时该怎么做,所以:

SELECT 
(pv1.price - pv2.price) AS 'Total Price',
pv1.price AS 'Spot Price',
pv2.price AS 'Discount'
FROM 
pricevalues pv1, pricevalues pv2
WHERE
pv1.priceindex = 'SPOT_INDEX_ID' AND 
pv1.pricedate = pv2.pricedate AND
pv2.priceindex = 'DISCOUNT_INDEX_ID'

这当然是不可能的,因为折扣指数中有这些巨大的差距,所以当日期不匹配时,我如何获得最新给定折扣的价值?

编辑:我希望输出如下所示:

    PRICEDATE        SPOT_INDEX         DISCOUNT_INDEX      SPOT_PRICE      
---------------- ------------------- --------------------- -----------   --->>>
   2013-07-26   |   SPOT_INDEX_ID   |  DISCOUNT_INDEX_ID  |   358.5   |

 DISCOUNT_PRICE       TOTAL_PRICE             
---------------- -------------------
      16.0      |       342.5       |
4

3 回答 3

0

您可以在给定日期的变量中获取折扣价格,然后在主查询中使用它。这是示例:

Declare @Discount_Price money
select Max(pricedate),@Discount_Price=Price from pricevalues where PriceIndex='DISCOUNT_INDEX_ID' group by Price having Price=Max(PriceDate)    
SELECT 
    (pv1.price - @Discount_Price) AS PriceDiff,
    pv1.price AS 'Spot Price',
    @Discount_Price AS 'Discount'
FROM 
    pricevalues pv1 
WHERE
    pv1.priceindex = 'SPOT_INDEX_ID'
于 2013-07-26T17:06:37.563 回答
0

如果您只想返回一条记录,这将起作用:

DECLARE @date DATE = GETDATE()
SELECT TOP 1 a.PRICEDATE, b.PRICE 'Spot', a.PRICE 'Discount', b.Price - a.Price 'Total'
FROM #Table1 a
JOIN (SELECT *,ROW_NUMBER() OVER (PARTITION BY PRICEINDEX ORDER BY PRICEDATE DESC)'RowRank'
      FROM #Table1
      WHERE PRICEINDEX = 'SPOT_INDEX_ID'
          AND PRICEDATE <= @date
      )b         
  ON b.RowRank = 1
WHERE a.PRICEINDEX = 'DISCOUNT_INDEX_ID'
       AND a.PRICEDATE <= @date 
ORDER BY a.PRICEDATE DESC

更改GETDATE()为您的查询日期。

我不确定你想要什么PRICEDATE,也许应该是b.PRICEDATE,或者只是@date

于 2013-07-26T17:16:41.683 回答
0

我通过结合使用 SQL 中的 FETCHES 和 Excel 中的处理解决了这个问题,我还处理了折扣索引中的差距。

于 2013-07-31T13:50:08.557 回答