2013-03-27 2 views
0

У меня есть простая таблица:Получение цена на каждую неделю

prices(fromwhichweek(int),newprice(int)) 
data example: 
1,20 
3,21 
10,30 

Так им ищет SQL оператора (ов), который возвращает Какие цены на каждую неделю?
Нечто подобное (по 3 ряда выше):

1,20 
2,20 
3,21 
4,21 
5,21 
6,21 
7,21 
8,21 
9,21 
10,30 
... 
+0

Ваш ожидаемый результат зависит от вашего ввода образца? если это так, у вас есть немного больше объяснений, чтобы сделать –

+0

Похоже, что цель состоит в том, чтобы заполнить недостающие недели по цене за предыдущую неделю. Но как мы узнаем, какой диапазон недель запрашивается? – WarrenT

ответ

-2

Вы можете создать таблицу, заполненную 1-52 неделями.

create table weeks (week int); 
insert into weeks values (1), (2), ....(52); 

Затем вы можете выполнить следующий запрос, чтобы получить результат. Это родной запрос MYSQL. Возможно, вам придется немного изменить его, если вы используете другого поставщика sql.

select A.week, B.price from weeks as A, prices as B where 
    B.fromwhichweek = (select C.fromwhichweek from prices as C where 
         C.fromwhichweek <= A.week order by C.fromwhichweek desc limit 1); 
-1

Это даст вам выход вы сказали, что вы хотели. Если вы хотите что-то другое, измените свой вопрос :)

SELECT 
    fromwhichweek, price 
FROM 
    prices 
ORDER BY 
    fromwhichweek ASC 
+0

это не даст мне каждую неделю ... – Palpatine

+0

ваши данные примера показывают только одно появление «fromwhichweek». есть ли несколько «от whichweek's с разными» ценами? отправьте еще несколько пробных данных, если вы хотите получить более реальный ответ. – rbedger

+0

пример был отредактирован. Существует только одно событие «fromwhichweek». Основная цель - получить Какую цену за неделю, потому что есть еще одна таблица с заказами, и есть какая неделя, какой человек заказал, например: человек1,1 (неделя), 1 (день), whatordered; человек1,1 (неделя), 2 (день), что заказано; человек1,1 (неделя), 3 (день), что заказано; человек1,2 (неделя), 1 (день), что заказано; человек1,2 (неделя), 2 (день), что заказано; , и я хочу знать, сколько человек1 должен заплатить за каждый день (хранящийся в ценах.цены). Надеюсь, я уточнил проблему. – Palpatine

0

Вам необходимо сгенерировать последовательность недель. Следующая версия получает цену с помощью связанного подзапроса в select заявлении:

select w.week, 
     (select top 1 newprice from prices p where w.week >= p.fromwhichweek 
     order by fromwhichweek desc 
     ) theprice 
from (select 1 as week union all select 2 union all select 3 union all select 4 union all 
     select 5 union all select 6 union all select 7 union all select 8 union all 
     select 9 union all select 10 
    ) w 

Некоторые комментарии. Это зависит от наличия списка недель. Здесь это делается с явным подзапросом. В зависимости от базы данных существуют и другие методы.

+0

@AaronBertrand. , , Думаю, я могу ослепнуть. Этот тэг был повторен три раза, и мне удалось его пропустить. –

0

Ниже приведен способ определения количества недель, требуемых динамически, исходя из самого высокого значения fromwhichweek в таблице. Вы можете выйти за рамки этого, назначив значение @end явно (например, попробуйте с 22 или 25) вместо использования MAX. Это должно масштабироваться ОК с 52 неделями, предполагая, что таблица цен действительно такая простая.

DECLARE @prices TABLE(fromwhichweek INT, newprice INT); 

INSERT @prices VALUES 
(1, 20), 
(3, 21), 
(10,30); 

DECLARE @start INT, @end INT; 

SELECT @start = MIN(fromwhichweek), 
     @end = MAX(fromwhichweek) 
FROM @prices; 

;WITH x AS 
(
    SELECT TOP (@[email protected]+1) 
    n = @start-1+ROW_NUMBER() OVER (ORDER BY [object_id]) 
    FROM sys.all_objects ORDER BY [object_id] 
) 
SELECT fromwhichweek = x.n, 
    newprice = COALESCE(p.newprice, (
    SELECT TOP (1) newprice FROM @prices 
    WHERE fromwhichweek <= x.n 
    AND newprice IS NOT NULL 
    ORDER BY fromwhichweek DESC)) 
FROM x 
    LEFT OUTER JOIN @prices AS p 
    ON x.n = p.fromwhichweek 
ORDER BY x.n; 
Смежные вопросы