2013-07-26 3 views
0

используемой версии: Microsoft SQL Server Management Studio, SQL Server 2008Асимметричные колонны - собирание последнее данное значение

Я столкнулся разочарование проблема, которая вызвана асимметричными колоннами. В принципе, я хочу рассчитать влияние скидки на данные спотовые цены. Оба устанавливаются как индексы в той же таблицеpricevalues ​​. Спот-цены указаны за 5 дней в неделю, а скидки указаны только в день их обновления. Так, например:

pricevalues ​​(индексы цен и дохода, цена, pricedate)

 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 

Как бы мне лучше всего идти о вычислении разницы между ценой для SPOT_INDEX_ID и DISCOUNT_INDEX_ID на все даты, заданной SPOT_INDEX_ID, если необходимо использовать последнюю цену (по отношению к цене PRICEEDATE of spot price) 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' 

Это, конечно, невозможно, так как эти огромные пробелы i n индекс дисконта, поэтому, когда даты не совпадают, как мне получить значение последних данных скидка?

EDIT: Я хотел бы выход, чтобы выглядеть следующим образом:

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  | 
+0

Не могли бы вы показать образец вывода, который хотите вернуть из этого запроса? Кроме того, существуют ли ежедневные записи для индекса пятна? –

+0

Я добавил образец вывода. Новые записи добавляются к индексу пятна 5 дней недели (пн-пт). Записи со скидкой добавляются нерегулярно. – KHH

ответ

0

Я решил проблему с комбинацией FETCHES в SQL и обработкой в ​​Excel, где я также позаботился о пробелах в индексе скидок.

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' 
+0

В то время как это работает для абсолютной последней данной скидки, мне нужно найти последнюю скидку * родственник * на место. Если у меня есть место в 2013-03-01, скидка на 2013-03-02 ** недействительна **, поскольку она не является последним относительно места.С другой стороны, скидка, указанная в 2013-02-29, будет действительной - если, конечно, нет других скидок, даже ближе к 2013-03-01 (из прошлого). – KHH

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?

+0

Есть ли способ изменить это, так что это функция диапазона дат и возвращает таблицу? Скажите, хочу ли я ВСЕГО ЦЕНА на все даты 2012-2013. – KHH

Смежные вопросы