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

Откуда:
Сообщений: 22
Задача следующая:
Есть такой набор данных (проводок по поставщику, например):
Дата Сумма ID
01.01.2011 10 111
02.01.2011 -30 222
02.01.2011 -100 221
04.01.2011 20 150
05.01.2011 -30 130
06.01.2011 40 180
07.01.2011 -60 240

Сальдо -140. Нужно найти операции, которые это отрицательное сальдо составляют начиная с последней, т.е. операции № 240, 130, 221, т.к. абс(-60 + -30 + -100) > абс(-140)

Вот сижу ломаю голову как это сделать... Буду признателен за помощь.
6 окт 11, 10:43    [11392987]     Ответить | Цитировать Сообщить модератору
 Re: Помогите отобрать только те записи, которые в сумме стали больше заданного числа  [new]
Longer
Member

Откуда:
Сообщений: 22
Уточню: MS SQL Server 2008 (RTM) - 10.0.1600.22 (X64)
6 окт 11, 10:56    [11393061]     Ответить | Цитировать Сообщить модератору
 Re: Помогите отобрать только те записи, которые в сумме стали больше заданного числа  [new]
aleks2
Guest
У тя проблемы со CTE?

Или ты ленивый просто?
6 окт 11, 11:01    [11393106]     Ответить | Цитировать Сообщить модератору
 Re: Помогите отобрать только те записи, которые в сумме стали больше заданного числа  [new]
Longer
Member

Откуда:
Сообщений: 22
aleks2
У тя проблемы со CTE?

Или ты ленивый просто?


Я не ленивый, я начинающий. Уточни, пожалуйста, что ты имел ввиду, или дай ссылку. Спасибо.
6 окт 11, 11:35    [11393368]     Ответить | Цитировать Сообщить модератору
 Re: Помогите отобрать только те записи, которые в сумме стали больше заданного числа  [new]
Longer
Member

Откуда:
Сообщений: 22
Common Table Expressions? Уже читаю, спасибо.
6 окт 11, 11:35    [11393380]     Ответить | Цитировать Сообщить модератору
 Re: Помогите отобрать только те записи, которые в сумме стали больше заданного числа  [new]
aleks2
Guest
declare @Есть_такой_набор_данных table(Дата datetime, Сумма int, ID int)

insert @Есть_такой_набор_данных
select
'01.01.2011', 10, 111
union all
select
'02.01.2011', -30, 222
union all
select
'02.01.2011', -100, 221
union all
select
'04.01.2011', 20, 150
union all
select
'05.01.2011', -30, 130
union all
select
'06.01.2011', 40, 180
union all
select
'07.01.2011', -60, 240


declare @Сальдо int
set @Сальдо=-140

;with
numbered as (select *, row_number() over(order by Дата DESC) num from @Есть_такой_набор_данных WHERE Сумма<0)
,
t as(
select cast(0 as datetime) Дата, 0 Сумма, -1 ID, @Сальдо Сальдо, cast(0 as bigint) num 
union all
select N.Дата, N.Сумма, N.ID, t.Сальдо-N.Сумма Сальдо, N.num 
FROM
t inner join numbered N ON t.num+1=N.num
WHERE t.Сальдо<0
)
select * FROM t WHERE ID<>-1
6 окт 11, 12:04    [11393650]     Ответить | Цитировать Сообщить модератору
 Re: Помогите отобрать только те записи, которые в сумме стали больше заданного числа  [new]
Longer
Member

Откуда:
Сообщений: 22
aleks2
declare @Есть_такой_набор_данных table(Дата datetime, Сумма int, ID int)

insert @Есть_такой_набор_данных
select
'01.01.2011', 10, 111
union all
select
'02.01.2011', -30, 222
union all
select
'02.01.2011', -100, 221
union all
select
'04.01.2011', 20, 150
union all
select
'05.01.2011', -30, 130
union all
select
'06.01.2011', 40, 180
union all
select
'07.01.2011', -60, 240


declare @Сальдо int
set @Сальдо=-140

;with
numbered as (select *, row_number() over(order by Дата DESC) num from @Есть_такой_набор_данных WHERE Сумма<0)
,
t as(
select cast(0 as datetime) Дата, 0 Сумма, -1 ID, @Сальдо Сальдо, cast(0 as bigint) num 
union all
select N.Дата, N.Сумма, N.ID, t.Сальдо-N.Сумма Сальдо, N.num 
FROM
t inner join numbered N ON t.num+1=N.num
WHERE t.Сальдо<0
)
select * FROM t WHERE ID<>-1


Большое спасибо.

Застрял в "t.Сальдо-N.Сумма Сальдо" - N.Сумма Сальдо - как рассчитать эту сумму?
6 окт 11, 12:35    [11393882]     Ответить | Цитировать Сообщить модератору
 Re: Помогите отобрать только те записи, которые в сумме стали больше заданного числа  [new]
Longer
Member

Откуда:
Сообщений: 22
Пытаюсь сделать так
; WITH
NUMBERED AS (SELECT VTR.TRANSDATE
				   , VTR.AMOUNTMST
				   , VTR.RECID
				   , ROW_NUMBER() OVER(ORDER BY TRANSDATE DESC, RECID DESC) NUM 
			  FROM VENDTRANS VTR WHERE VTR.DATAAREAID = @DataAreaId AND VTR.AMOUNTMST > 0 AND VTR.RCONTRACTACCOUNT = @RCA)
 , t AS (SELECT CAST(0 AS DATETIME) TRANSDATE
			  , CAST(0 AS numeric(28,12)) AS AMOUNTMST
			  , CAST(0 AS BIGINT) AS RECID
			  , CAST (@DIFF AS numeric(28,12)) AS DIFF
			  , CAST(0 AS BIGINT) NUM
		 UNION ALL
		 SELECT N.TRANSDATE
			  , N.AMOUNTMST
			  , N.RECID
			  , cast((t.DIFF - (select abs(sum(N2.AMOUNTMST)) --AS AMOUNTMST 
					FROM NUMBERED AS N2 where N2.RECID <= N.RECID)) AS numeric(28,12)) AS DIFF
			  , N.NUM
			FROM t INNER JOIN NUMBERED N ON t.NUM+1=N.NUM
			WHERE t.AMOUNTMST < 0
		 )
	SELECT * FROM t WHERE t.RECID <> 0

Но появляется ошибка

Msg 467, Level 16, State 1, Line 32
Функции GROUP BY, HAVING и статистические функции не разрешены в рекурсивной части рекурсивного обобщенного табличного выражения "t".
6 окт 11, 12:45    [11393971]     Ответить | Цитировать Сообщить модератору
 Re: Помогите отобрать только те записи, которые в сумме стали больше заданного числа  [new]
Longer
Member

Откуда:
Сообщений: 22
Протупил :( А еще только четверг... что будет в пятницу?
6 окт 11, 14:57    [11395287]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить