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

Откуда: г. Севастополь
Сообщений: 34
Вопрос в следующем:
Имею поле сумм с (разными знаками)
Sum
100
-50
-20
100
-130
Надо получить набор где поле Saldo-(текущее сальдо) сумма предыдущих строк и текущей:
Sum Saldo
100 100
-50 50
-20 30
100 130
-130 0

Может кто делал (задача в принципе распространенная) подскажите.

ЗЫ:
Как это сделать с помощью курсора я догадываюсь, а есть ли другие варианты?
9 апр 02, 10:47    [25294]     Ответить | Цитировать Сообщить модератору
 RE:Получение текущего сальдо  [new]
Denis
Guest
А чем не устраивает курсор?
9 апр 02, 10:59    [25295]     Ответить | Цитировать Сообщить модератору
 RE:Получение текущего сальдо  [new]
Bomber
Guest
Если бы было время платежа (paydate), я бы сделал так

select suma,
(select sum(suma) from pays sec where sec.paydate<pri.paydate) as saldo
from pays pri
9 апр 02, 11:09    [25296]     Ответить | Цитировать Сообщить модератору
 RE:Получение текущего сальдо  [new]
Lesnick
Member

Откуда: г. Севастополь
Сообщений: 34
>А чем не устраивает курсор?

Та в общем-то устраивает(собственно нечто подобное у меня сейчас и реализовано только на клиенте), просто хотелось узнать другие способы(век живи век учись!!!)

2Bomber

Спасибо, идею понял, но вот беда - поле Data у меня есть, но мне надо в чтоб енто все работало и внутри одной даты в том числе.(Это работало бы если б хранилось еще и время, но увы я его не имею)
9 апр 02, 13:34    [25297]     Ответить | Цитировать Сообщить модератору
 RE:Получение текущего сальдо  [new]
jimmers
Guest
Приветствую,

Насколько я понимаю, Вы упорядочиваете каким-то образом выборку (иначе каков смысл сальдо?)

Тогда Вы могли бы просто сохранить упорядоченную выборку в переменной типа таблица, а далее
воспользоваться советом г-на Bomber'а.

Если же структура таблицы у Вас такова, что каждому значению Sum можно сопоставить поле типа
int identity, причем так, что для каждого последующего значения Sum значение поля типа int
увеличивается, то его можно использовать вместо даты в варианте, предложенном Bomber.

Удачи
9 апр 02, 14:04    [25298]     Ответить | Цитировать Сообщить модератору
 RE:Получение текущего сальдо  [new]
Andrey
Member

Откуда: Germany. SAP
Сообщений: 371
IMHO тут важно чтобы хоть было по чему сортировать ... в противном случае не понятно по какому принципу Вы отсортировали в приведенном примере. Если они вводились, например, в порядке возрастания, то и запрос можно следующим образом:

select suma,
(select sum(suma) from pays sec where sec.id<pri.id) as saldo
from pays pri
9 апр 02, 14:07    [25299]     Ответить | Цитировать Сообщить модератору
 RE:Получение текущего сальдо  [new]
Lesnick
Member

Откуда: г. Севастополь
Сообщений: 34
2 jimmer and Andrey

Конечно вы правы, сортировка у меня есть, причем по двум полям сразу(дата и дата ввода записи, какраз для сортировки внутри одной даты), а поле PK содержит случайные значения(по функции).

А мысль загнать во временную таблицу (где поле PK int identity и сравнения делать по нему) мне подходит.

Если можно выскажите свои соображения по поводу сравнения методов через курсор и выше рассмотренный(при разных размерах полученного набора от 10 до 10000) что бедет работать быстрее (при этом количество плей около 20).
10 апр 02, 06:19    [25300]     Ответить | Цитировать Сообщить модератору
 RE:Получение текущего сальдо  [new]
qu-qu
Guest
Господи, девушка, не слушайте вы их... (Bomber,jimmer, Andrey)

Этот вопрос (про сальдо нарастающим итогом) настолько уже тут "навяз всем в зубах", что постоянные "читатели/писатели" этой конфы даже не открывают ветки с подобными названиями, не то чтобы ответить нормально, а даже - чтобы написать что-нить типа: "ищите в конфе, ранее это уже обсуждалось"... (а FAQ-а как не было, так до сих пор и нет).

Сделайте так:

\nset nocount on
create table #ttt
(
Value int not null,
Sum_ int not null
)

insert into #ttt (Value,Sum_) select 10,0
insert into #ttt (Value,Sum_) select 10,0
insert into #ttt (Value,Sum_) select 10,0
insert into #ttt (Value,Sum_) select 10,0
insert into #ttt (Value,Sum_) select -10,0
insert into #ttt (Value,Sum_) select -10,0
insert into #ttt (Value,Sum_) select -10,0
insert into #ttt (Value,Sum_) select 10,0

declare @RunningSum int
select @RunningSum = 0

update #ttt set @runningsum = Sum_ = @runningsum + value -- сумма передыдущих строк и текущей

select * from #ttt



Если сомневаетесь в правильности данного решения - посмотрите внимательно в BOL на все(!) возможные синтаксисы оператора UPDATE...

З.Ы. временную таблицу можете заполнять выборкой из рабочей с любым порядком сортировки, т.к. UPDATE по вр. таблице будет сканировать все ее записи в порядке поступления (проверенный факт, но при этом - только 1 раз и без всякого курсора). А вложенный (select sum() ...) на 10000 записей - даст вам ровно 10000 запросов, которые сервер заманается "пережевывать".

Удачи!
10 апр 02, 06:51    [25301]     Ответить | Цитировать Сообщить модератору
 Re: Получение текущего сальдо  [new]
Коляныч
Member

Откуда:
Сообщений: 279
Цитата: временную таблицу можете заполнять выборкой из рабочей с любым порядком сортировки, т.к. UPDATE по вр. таблице будет сканировать все ее записи в порядке поступления (проверенный факт,... (by qu-qu)

вот это больше всего настораживает, что это всего лишь "проверенный факт", а не документированная и специфицированная особенность. Собственно вопрос у меня такой - насколько это 100%, что сканирование будет именно последовательным? Записи занесутся в таблицу гарантировано именно в последовательности заданной order by? Кто даёт такие гарантии? Остаются ли какие-либо гарантии после модификации части полей (если мне нужно вести несколько наростающих итогов по разным полям одной и той же таблицы несколькими update, то не получится ли так, что после первого update последовательность прохода нарушится)? Короче, в чём можно быть уверенным 100% и в чём лучше не быть уверенным?

thanx
26 мар 03, 05:59    [156415]     Ответить | Цитировать Сообщить модератору
 Re: Получение текущего сальдо  [new]
Некто
Member

Откуда: Киев
Сообщений: 312
2Коляныч
>Записи занесутся в таблицу гарантировано именно в последовательности заданной order by? Кто даёт такие гарантии? Остаются ли какие-либо гарантии после модификации части полей (если мне нужно вести несколько наростающих итогов по разным полям одной и той же таблицы несколькими update, то не получится ли так, что после первого update последовательность прохода нарушится)?
А на кой Вам такие гарантии? Зачем Вам вообще знать как сервер хранит эти записи? Нарастающие итоги расчитаются в зависимости от order by сколько таблицы не обновляйте. А порядок физического размещения записей определяется либо кластерным индексом, либо прихотью сервера.

2Lesnick
select t.sum , rs = sum (t1.sum )

from table t
left outer join table t1
on t.data > t1.data
26 мар 03, 14:11    [156856]     Ответить | Цитировать Сообщить модератору
 Re: Получение текущего сальдо  [new]
Коляныч
Member

Откуда:
Сообщений: 279
Некто
по моему у варианта с update трудоёмкость на порядок меньше. При больших количествах строк в таблице такой join будет кажись работать существенно дольше (я рассуждаю в терминах трудоёмкости для привычных алгоритмических задач)
27 мар 03, 05:47    [157530]     Ответить | Цитировать Сообщить модератору
 Re: Получение текущего сальдо  [new]
Некто
Member

Откуда: Киев
Сообщений: 312
2Коляныч
>по моему у варианта с update трудоёмкость на порядок меньше.
Полагаю, Вы правы (хотя не проводил тестов на быстродействие, а было бы интересно), просто в последнее время в этот вариант летит масса камней, типа -недокументированная фича и т.п. Поэтому, собственно и привел другой (классический :-) ) способ расчета нарастающих итогов. Group by, правда забыл.
27 мар 03, 13:55    [158021]     Ответить | Цитировать Сообщить модератору
 Re: Получение текущего сальдо  [new]
fima
Member

Откуда: Москва
Сообщений: 583
На этом сайте в разделе FAQ есть хороший пример по нарастающему итогу...
27 мар 03, 14:03    [158032]     Ответить | Цитировать Сообщить модератору
 Re: Получение текущего сальдо  [new]
Коляныч
Member

Откуда:
Сообщений: 279
fima
ну дык там то же самое, и точно так же без каких-либо указаний на широту применимости
27 мар 03, 14:22    [158051]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить