Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 выбор строки при превышении выбранной суммы  [new]
borikgogi
Member

Откуда:
Сообщений: 9
Доброго времени.
Есть таблица table с полями id, debit, credit
id | debit | credit
--------------------------
1 | 1500 | NULL
2 | NULL | 800
3 | 200 |NULL
4 | NULL |1500
5 | 1300 |NULL
6 | NULL |500
7 | 800 | NULL
8 | 938 |NULL

Задача состоит в следующем: нужно выбрать строку где от суммы столбца credit отнимать построчно столбец debit пока сумма кредита не будет меньше 0.
Т.е. сумма столбца credit
(2800) - 1500 = 1300
1300 - 200 = 1100
1100 - 1300 = -200 - это 5-ая строка.
и выбрать все данные 5-ой строки.
13 ноя 18, 00:06    [21732414]     Ответить | Цитировать Сообщить модератору
 Re: выбор строки при превышении выбранной суммы  [new]
Гавриленко Сергей Алексеевич
Member

Откуда: Moscow
Сообщений: 36972
Фраза для поиска -- "нарастающий итог".
13 ноя 18, 00:14    [21732418]     Ответить | Цитировать Сообщить модератору
 Re: выбор строки при превышении выбранной суммы  [new]
Glebanski
Member

Откуда: Msk ->NL
Сообщений: 308
Неплохая задачка. Надо своим студентам тоже предложить
13 ноя 18, 00:14    [21732419]     Ответить | Цитировать Сообщить модератору
 Re: выбор строки при превышении выбранной суммы  [new]
court
Member

Откуда:
Сообщений: 2016
declare @t table (id int, debit int, credit int)
insert into @t values
(1 , 1500 , NULL),
(2 , NULL	, 800),	
(3 , 200 ,NULL),
(4 , NULL	,1500),
(5 , 1300 ,NULL),
(6 , NULL ,500),	
(7 , 800 , NULL),
(8 , 938	,NULL)

;with cte as (
	select 
		*
		,all_credit		=sum(credit)over()
		,cur_debit		=sum(debit)over(order by id)   
	from @t
)
select top 1 
	* 
from cte 
where all_credit-cur_debit<0
order by /* ?? all_credit-cur_debit desc, */ id 
13 ноя 18, 10:58    [21732716]     Ответить | Цитировать Сообщить модератору
 Re: выбор строки при превышении выбранной суммы  [new]
borikgogi
Member

Откуда:
Сообщений: 9
court,

Спасибо. Теперь понял как это работает.
И еще вопрос, я так понимаю OVER (ORDER BY id) работает в версиях >=2012, а есть ли возможность реализовать это все на MSSQL2008?
Или лучше переходить на 2012 версию и не морочить голову?

P.S. в 2012 пока не доводилось работать.
13 ноя 18, 12:08    [21732817]     Ответить | Цитировать Сообщить модератору
 Re: выбор строки при превышении выбранной суммы  [new]
court
Member

Откуда:
Сообщений: 2016
borikgogi
на MSSQL2008

;with cte as (
	select 
		t1.*
		,all_credit		=sum(t1.credit)over()
--		,cur_debit		=sum(debit)over(order by id)
		,x.cur_debit   
	from @t t1
	outer apply(select sum(t2.debit) as cur_debit from @t t2 where t2.id<=t1.id) x
)
select top 1 
	* 
from cte 
where all_credit-cur_debit<0
order by /* ?? all_credit-cur_debit desc, */ id 
13 ноя 18, 12:15    [21732826]     Ответить | Цитировать Сообщить модератору
 Re: выбор строки при превышении выбранной суммы  [new]
borikgogi
Member

Откуда:
Сообщений: 9
court,

Мда... на 2012 более проще )
Спасибо!
13 ноя 18, 12:21    [21732835]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить