Help нарастающий итог !

_Fix
Дата: 27.02.2001 11:52:07
как сделать колонку нарастающего итога ?
есть

Id
-------
1
2
4
5
10

надо

Id IdIncr
------- -------
1 1
2 3
4 7
5 12
10 22


возможно ли так сделать в одном "ядерном" запросе без курсоров или WHILE ... END

Спасибо
Genady
Дата: 27.02.2001 12:15:47
Думается мне что в запросе это сделать не удастся, т. к. SQL оперирует множествами записей без учета их порядка. А Вам нужна построчная обработка записей. Так что, я думаю Вам без курсора и While End не обойтись.
Andriuska
Дата: 27.02.2001 12:25:42
Вот тебе такое решение, где расчитывается итог на каждый месяц для конкретного saskID

Долго, помнится пыхтел, пока наколдовал. Но работает отлмчно. Принцип такой: есть клиент с saskID, есть таблица счетов и оплат. Ну, и следовательно,
запрос дает вот что

Дату (год и месяц) Платить Заплачено Баланс

Если что неясно, пиши... А так вроде то, что надо

SELECT ISNULL(s.smetai, m.mmetai) Metai,
ISNULL(s.smen, m.mmen) Men,
s.smok Moketi,
ISNULL(m.mmok, 0) Sumoketa,
(SELECT ISNULL(SUM(sumoketa), 0)
FROM mokejimai_geri
WHERE saskID = @saskID AND
CONVERT(CHAR(6), mokdata, 112) <= ISNULL(MDS, SDS))-
(SELECT ISNULL(SUM(moketi), 0)
FROM saskaitos
WHERE saskID = @saskID AND
CONVERT(CHAR(6), datanuo, 112) <= ISNULL(SDS, MDS))
Balansas
FROM
(
SELECT saskID, YEAR(datanuo) AS SMetai,
CONVERT(CHAR(2), datanuo, 10) AS SMen, SUM(moketi) AS SMok,
CONVERT(CHAR(6), datanuo, 112) AS SDS
FROM saskaitos
WHERE (saskID = @saskID)
GROUP BY saskID, YEAR(datanuo), CONVERT(CHAR(2), datanuo, 10), CONVERT(CHAR(6), datanuo, 112)
) s

FULL OUTER JOIN

(
SELECT saskID, YEAR(mokdata) AS MMetai,
CONVERT(CHAR(2), mokdata, 10) AS MMen, SUM(sumoketa) AS MMok,
CONVERT(CHAR(6), mokdata, 112) AS MDS
FROM mokejimai_geri
WHERE (saskID = @saskID)
GROUP BY saskID, YEAR(mokdata), CONVERT(CHAR(2), mokdata, 10), CONVERT(CHAR(6), mokdata, 112)
) m

ON s.saskID = m.saskID AND s.SDS = m.MDS

WHERE s.saskID = @saskID OR m.saskID = @saskID
ORDER BY ISNULL(s.smetai, m.mmetai) DESC, ISNULL(m.mmen, s.smen) DESC
SergSuper
Дата: 27.02.2001 14:00:12
Ну Andriuska, прямо на грани гениальности. Врядли кто найдётся такой же гениальный что бы в этом разобраться
Можно же было бы попроще предложить.

create table #t(id int)
insert #t select 1 union select 2 union select 4 union select 5 union select 10

select t1.id, sum(t2.id) IdIncr
from #t t1, #t t2
where t2.id<=t1.id
group by t1.id

Это в предположении что порядок задан по возвастанию значений. Если задан другой порядок, то надо просто в условии сравнивать соответствующие ключи.

С приветом Сергей
sergsuper@mail.ru
PS. Извиняюсь, что запрос "не ядерный"
PPS. По возможности старайтесь не использовать
- курсоры
- вложенные селекты
- from из (select ...)
Не то что это нельзя или нехорошо, просто без них чаще получается более красивое и короткое решение.
Genady
Дата: 27.02.2001 14:40:00
Дааааа... Красиво!

А я то все думал, зачем в джоине могут понадобится условия на неравенство
Спасибо за пример, SergSuper.
VadimB
Дата: 27.02.2001 19:03:27
Alex_AD, если предыдущие запросы не осилили, то попробуй этот запрос
-- T(ID int)

select t1.ID,sum(t2.ID)
from T t1,T t2
where t1.ID>=t2.ID
group by t1.ID
VadimB
Дата: 27.02.2001 19:16:44
Извините, уменя тоже, что и у SergSuper
uchastik
Дата: 13.02.2003 16:28:50
Чего то я не понял
имеется таблица -
1 колонка дата, 2 приход товара на эту дату

01.01.03 2
02.01.03 5
02.01.03 4
03.01.03 8
04.01.03 1
04.01.03 3
05.01.03 10

Как получить таблицу в которой в второй колонке будет сумма полученного
товара вот такую

01.01.03 2
02.01.03 11
03.01.03 19
04.01.03 23
04.01.03 33

Поможите , может встречались с такой проблемой?
uchastik
Дата: 13.02.2003 16:59:29
Help mi !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
ziktuw
Дата: 13.02.2003 17:03:19
А кто в таблице - первичный ключ? От его отсутствия и все проблемы