Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / выбор строки при превышении выбранной суммы / 7 сообщений из 7, страница 1 из 1
13.11.2018, 00:06
    #39732083
borikgogi
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
выбор строки при превышении выбранной суммы
Доброго времени.
Есть таблица 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-ой строки.
...
Рейтинг: 0 / 0
13.11.2018, 00:14
    #39732084
Гавриленко Сергей Алексеевич
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
выбор строки при превышении выбранной суммы
Фраза для поиска -- "нарастающий итог".
...
Рейтинг: 0 / 0
13.11.2018, 00:14
    #39732085
Glebanski
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
выбор строки при превышении выбранной суммы
Неплохая задачка. Надо своим студентам тоже предложить
...
Рейтинг: 0 / 0
13.11.2018, 10:58
    #39732272
court
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
выбор строки при превышении выбранной суммы
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
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 
...
Рейтинг: 0 / 0
13.11.2018, 12:08
    #39732335
borikgogi
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
выбор строки при превышении выбранной суммы
court,

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

P.S. в 2012 пока не доводилось работать.
...
Рейтинг: 0 / 0
13.11.2018, 12:15
    #39732339
court
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
выбор строки при превышении выбранной суммы
borikgogiна MSSQL2008
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
;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 
...
Рейтинг: 0 / 0
13.11.2018, 12:21
    #39732345
borikgogi
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
выбор строки при превышении выбранной суммы
court,

Мда... на 2012 более проще )
Спасибо!
...
Рейтинг: 0 / 0
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / выбор строки при превышении выбранной суммы / 7 сообщений из 7, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]