2015-07-11 2 views
0

У меня есть таблица, которая выглядит следующим образом:«переменное» кумулятивное значение в SQL Server

id count price 
1 100  2 
2 50  3 
3 10  4 

Я хочу, чтобы получить цену для определенных кумулятивных значений счетчика, например: , когда я «потребность» подсчет из 120, SQL кумулирует первые x строк и проверяет, соответствует ли кумулятивное значение в x-й строке требованиям (> 120), а затем возвращает мне значение цены x-й строки.

120 Я хочу, чтобы получить 3, как цена, за 159,5 затем 4, для 80 2 и т.д.

Это возможно в SQL Server?

+1

Что означает «когда я запрос 120» означает? –

+0

Вам нужна цена, соответствующая значению (или сумме значений), наиболее близкому к вашей «переменной»? (Это было даже сложно задать вопрос ...) –

+0

Я обновил свой пост, извините, если неясно, я надеюсь, что теперь его лучше. –

ответ

3

Подумайте вы хотите:

select top 1 
     [price] 
from(
select [id], 
     [count], 
     [price], 
     sum([count]) over(order by [id]) as run_sum 
from tbl 
) x 
where 120 <= run_sum 
order by run_sum 

Fiddle:http://www.sqlfiddle.com/#!6/a1976/5/0

Fiddle пример 159.5, http://www.sqlfiddle.com/#!6/a1976/6/0

Fiddle пример 80, http://www.sqlfiddle.com/#!6/a1976/7/0

+0

Спасибо, это работает! Я думаю, что ваш запрос работает быстрее, чем ниже? (я хочу запросить его несколько тысяч раз за короткое время) –

+1

Np, он только один раз обращается к таблице из-за аналитической функции (не присоединяется к той же таблице), поэтому она должна быть немного быстрее –

1
select top 1 price from 
(
    select t1.id, t1.count, SUM(t2.count) as sum, t1.price 
    from table_name t1 
    inner join table_name t2 on t1.id >= t2.id 
    group by t1.id, t1.count, t1.price 
) t where t.sum >= 120 order by sum 

fiddle