powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / помогите с запросом - что-то туплю
25 сообщений из 31, страница 1 из 2
помогите с запросом - что-то туплю
    #33765252
Perederiy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
есть таблица
id,summa
например
1 4444
2 333
3 -444
4 22
5 44
6 -555
Надо составить запрос для подсчета суммы нарастающим итогом по каждой записи
те должно будет
1 4444
2 4444+333
3 4444+333-444
и ьд
...
Рейтинг: 0 / 0
помогите с запросом - что-то туплю
    #33765347
Andrey Daeron
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Например это есть в ФАКю http://www.sql.ru/faq/faq_topic.aspx?fid=125
...
Рейтинг: 0 / 0
помогите с запросом - что-то туплю
    #33765372
Алексей Ключников
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ФАК то по MSSQL.
...
Рейтинг: 0 / 0
помогите с запросом - что-то туплю
    #33765390
Владимор Конев
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Perederiyесть таблица

Надо составить запрос для подсчета суммы нарастающим итогом по каждой записи
Плюс к тому, что предложили предыдущие ораторы:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
select id,
       summa,
       (
          select sum(SUMMA) 
            from t t2 
           where t1.id >= t2.id
       )  as slide_summ
  From t t1

Query finished, retrieving results...

ID  SUMMA  SLIDE_SUMM
--  -----  ----------
  1     4444          4444 
  2      333          4777 
  3    - 444          4333 
  4       22          4355 
  5       44          4399 
  6    - 555          3844 
 6  row(s) retrieved
...
Рейтинг: 0 / 0
помогите с запросом - что-то туплю
    #33765645
Perederiy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Владимор Конев Perederiyесть таблица

Надо составить запрос для подсчета суммы нарастающим итогом по каждой записи
Плюс к тому, что предложили предыдущие ораторы:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
select id,
       summa,
       (
          select sum(SUMMA) 
            from t t2 
           where t1.id >= t2.id
       )  as slide_summ
  From t t1

Query finished, retrieving results...

ID  SUMMA  SLIDE_SUMM
--  -----  ----------
  1     4444          4444 
  2      333          4777 
  3    - 444          4333 
  4       22          4355 
  5       44          4399 
  6    - 555          3844 
 6  row(s) retrieved


у меня другая ситуация
select
t1.summa,
(
select sum(t2.SUMMA)
from t1 t2
where t1.id >= t2.id
) as slide_summ
From (select очень длинный запрос) t1

пишет ошибку - нет отношения t2
Можно как-то вычислять сумму нарастающим без подзапроса ?
...
Рейтинг: 0 / 0
помогите с запросом - что-то туплю
    #33765675
Владимор Конев
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
PerederiyМожно как-то вычислять сумму нарастающим без подзапроса ?Эх, по ссылке ты так и не прошелся?
Вот тебе пример:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
SELECT T1.ID, 
       T1.SUMMA, 
       SUM(T2.SUMMA) AS SLIDE_SUMM
  FROM T T1
 INNER JOIN
       T T2
    ON T1.ID >= T2.ID
GROUP BY T1.ID, T1.SUMMA

ID  SUMMA  SLIDE_SUMM
--  -----  ----------
  1     4444          4444 
  2      333          4777 
  3    - 444          4333 
  4       22          4355 
  5       44          4399 
  6    - 555          3844 

 6  row(s) retrieved
...
Рейтинг: 0 / 0
помогите с запросом - что-то туплю
    #33765695
Perederiy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
прочитал в FAQ

да жалко мне вас
в oracle это 1-м запросом
select t.*,
sum(am)
over (partition by acc
order by t.cr_date
) tot
from vedomost t

Есть ли подобная фишка в PostgreSQL ?
...
Рейтинг: 0 / 0
помогите с запросом - что-то туплю
    #33765730
Владимор Конев
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Perederiyпрочитал в FAQ

да жалко мне вас
в oracle это 1-м запросом
select t.*,
sum(am)
over (partition by acc
order by t.cr_date
) tot
from vedomost t

Есть ли подобная фишка в PostgreSQL ?Это кого именно жалко-то???
Лично я сам на Оракле сижу :), что и не трудно видеть, заглянув в мой профиль...
А аналитический SQL в PostgreSQL пока ещё отсутствует.
...
Рейтинг: 0 / 0
помогите с запросом - что-то туплю
    #33765782
Perederiy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
насчет жалко - я просто цитировал FAQ
...
Рейтинг: 0 / 0
помогите с запросом - что-то туплю
    #33765807
st_serg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
PerederiyЕсть ли подобная фишка в PostgreSQL ?
order by siblings есть ли подобная фишка в oracle8 ? Насколько я знаю нету. Пытались ли вы в pl/sql коде делать примерно такой курсор

select 1 as a, (select 1 from dual) as b from dual

в oracle8 он не работает (по крайней мере у меня)

фишки они, как правило, добавляются со временем, имхо ваша жалость неуместна.
...
Рейтинг: 0 / 0
помогите с запросом - что-то туплю
    #33765815
st_serg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Perederiyнасчет жалко - я просто цитировал FAQ
тогда sorry )
...
Рейтинг: 0 / 0
помогите с запросом - что-то туплю
    #33765841
Владимор Конев
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
st_serg order by siblings есть ли подобная фишка в oracle8 ? Насколько я знаю нету. Пытались ли вы в pl/sql коде делать примерно такой курсор

select 1 as a, (select 1 from dual) as b from dual

в oracle8 он не работает (по крайней мере у меня)

фишки они, как правило, добавляются со временем, имхо ваша жалость неуместна.
Про siblings - оно конечно же есть в Оракле, вот только начиная с 9-ки :-)
Хотя, сами иерархические запросы появились задолго до этого релиза.
ЗАто иерархические запросы - совершенно легальная и вполне стабильно работающая вещь в Оракле, чего не скажешь про PostgreSQL.
Что касается запроса:
Код: plaintext
select  1  as a, (select  1  from dual) as b from dual
, то он тоже отлично работает :) Правда проверить работоспособность именно на 8-ки - нет возможности
...
Рейтинг: 0 / 0
помогите с запросом - что-то туплю
    #33765876
4321
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
напишите процедуру типа
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
блаблабла ...
Returns SETOF ваштабличный_тип_вывода 
AS 
...
For _rec IN SELECT ... ORDER BY .... заLOOP- ить
   _rec1 = ROW(....)
   RETURN NEXT _rec1
....
будет видимо быстрее чем "заново" считать частичные суммы для каждой строки - что происходит в случае рекомендованных запросов.

можно еще пофантазировать на тему создания переменной сессии и использовании ее в качестве "накопительной" в некой волатильной функции-сумматоре в запросе (на предмет использования конечного запроса в дальнейших джойнах и т.п.). Вот только порядок исполнения в том же порядке, что и порядок конечной сортировки записей вряд ли гарантирован для любого плана.
...
Рейтинг: 0 / 0
помогите с запросом - что-то туплю
    #33765890
st_serg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Владимор КоневПравда проверить работоспособность именно на 8-ки - нет возможности
что в 9ке работает знаю, а когда этот код попал в 8ку для меня это было сюрпризом. не очень приятным.
...
Рейтинг: 0 / 0
помогите с запросом - что-то туплю
    #33765906
st_serg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
только не обычный запрос, а именно в pl/sql коде. обычный запрос и в 8ке прекрасно работает.
...
Рейтинг: 0 / 0
помогите с запросом - что-то туплю
    #33765970
Владимор Конев
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
4321Вот только порядок исполнения в том же порядке, что и порядок конечной сортировки записей вряд ли гарантирован для любого плана.НЕ твоя правда :)
Если можно однозначно задать порядок итоговой выборки, то можно совершенно также ОДНОЗНАЧНО задать порядок вычисления "накопительной суммы", просто условия фильтрации данных в подзапросе расчета накопительной суммы нужно определять соответствующим образом :).
...
Рейтинг: 0 / 0
помогите с запросом - что-то туплю
    #33765983
Владимор Конев
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
st_sergтолько не обычный запрос, а именно в pl/sql коде. обычный запрос и в 8ке прекрасно работает.НУ, это уж издержки различий в SQL и PL/SQL машинах 8-й версии Оракла.
Оно, к примеру, в 8-ке CASE в SQL есть и отлично работает, а в PL/SQL - дудки, то же самое касательно аналитического SQL.
Но все решаемо - есть динамический SQL, есть запрос из представления - при их помощи можно скрыть всё то, что PL/SQL-ный движок не понимает.
...
Рейтинг: 0 / 0
помогите с запросом - что-то туплю
    #33766004
Perederiy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
что в лоб - что по лбу
в моем случае он не видит t2
...
Рейтинг: 0 / 0
помогите с запросом - что-то туплю
    #33766031
Владимор Конев
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Perederiyчто в лоб - что по лбу
в моем случае он не видит t2Приведи свой вариант запроса... Именно в том виде, как ты его написал.
...
Рейтинг: 0 / 0
помогите с запросом - что-то туплю
    #33766059
Perederiy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
это очень длинно будет
в принципе так будет :

select
t1.summa,
(
select sum(t2.SUMMA)
from t1 t2
where t1.id >= t2.id
) as slide_summ
From (select очень длинный запрос) t1

не видит отношения t2
все верно - в подзапросе комп не знает что такое t1
Но как его заставить понять что t1 уже определен в главном FROM ?
...
Рейтинг: 0 / 0
помогите с запросом - что-то туплю
    #33766088
Владимор Конев
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Perederiyэто очень длинно будет
в принципе так будет :

select
t1.summa,
(
select sum(t2.SUMMA)
from t1 t2
where t1.id >= t2.id
) as slide_summ
From (select очень длинный запрос) t1

не видит отношения t2
все верно - в подзапросе комп не знает что такое t1
Но как его заставить понять что t1 уже определен в главном FROM ?Ну, батенька. Так это у тебя не таблица, а встроенное представление получается (в терминах Oracle) :).
И тебе должно быть известно, что встроенное представление (даже в Оракле) не может быть коррелированным. Не думаю, что в других субд по другому - таки это ANSI-стандарт и все СУБД более-менее ему следуют.

Таки тебе придется показать запрос полностью :)
...
Рейтинг: 0 / 0
помогите с запросом - что-то туплю
    #33766126
Perederiy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ну если это поможет ...
это работает
а вот дальше я туплю

select q2.naim,q2.god from (SELECT '' as naim,q1.god,round(sum(q1.summanas)-sum(q1.summaopl),2) as dolg FROM (SELECT

"period"."god",
SUM("oplatateplo"."summa") as summaopl,
0 as summanas

FROM
"public"."period" "period"
INNER JOIN "public"."oplatateplo" "oplatateplo"
ON "period"."period_id" = "oplatateplo"."period_id"

WHERE
("period"."god" <= 2005 )
GROUP BY
"period"."god"
UNION
SELECT

"period"."god",
0 as summaopl,
SUM("prodagateplo"."summa") as summanas
FROM
"public"."period" "period"
INNER JOIN "public"."prodagateplo" "prodagateplo"
ON "period"."period_id" = "prodagateplo"."period_id"

WHERE
("period"."god" <= 2005)
GROUP BY
"period"."god"
UNION
SELECT

"period"."god",
0 as summaopl,
SUM("lgotteplosumma"."summagvs")+SUM("lgotteplosumma"."summateplo")*(-1) as summanas

FROM
"public"."contragentteplo" "contragentteplo"
INNER JOIN "public"."lgotteplosumma" "lgotteplosumma"
ON "contragentteplo"."contragentteplo_id" = "lgotteplosumma".
"contragentteplo_id"
INNER JOIN "public"."period" "period"
ON "period"."period_id" = "contragentteplo"."period_id"

WHERE
("period"."god" <= 2005)
GROUP BY
"period"."god") q1 group by q1.god order by q1.god ) q2
...
Рейтинг: 0 / 0
помогите с запросом - что-то туплю
    #33766159
4321
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Perederiyэто очень длинно будет
в принципе так будет :

select
t1.summa,
(
select sum(t2.SUMMA)
from t1 t2
where t1.id >= t2.id
) as slide_summ
From (select очень длинный запрос) t1

не видит отношения t2
все верно - в подзапросе комп не знает что такое t1
Но как его заставить понять что t1 уже определен в главном FROM ?
формально - либо сохранить t1 как вью
, либо
Код: plaintext
1.
2.
3.
4.
(
select sum(t2.SUMMA)
 from (select очень длинный запрос) t2
  where t1.id >= t2.id
)
...
Рейтинг: 0 / 0
помогите с запросом - что-то туплю
    #33766217
Владимор Конев
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Perederiyну если это поможет ...
это работает
а вот дальше я туплю

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
select q2.naim,q2.god from (SELECT '' as naim,q1.god,round(sum(q1.summanas)-sum(q1.summaopl), 2 ) as dolg FROM (SELECT
       
	"period"."god",
	SUM("oplatateplo"."summa") as summaopl,
         0  as summanas
 
FROM
	"public"."period" "period" 
		INNER JOIN "public"."oplatateplo" "oplatateplo" 
		ON "period"."period_id" = "oplatateplo"."period_id" 

WHERE
	("period"."god" <=  2005  ) 
GROUP BY
	"period"."god"
UNION
SELECT
        
	"period"."god",
          0  as summaopl,
	SUM("prodagateplo"."summa") as summanas 
FROM
	"public"."period" "period" 
		INNER JOIN "public"."prodagateplo" "prodagateplo" 
		ON "period"."period_id" = "prodagateplo"."period_id" 

WHERE
	("period"."god" <=  2005 )  
GROUP BY
	"period"."god"
UNION
SELECT
       
	"period"."god",
          0  as summaopl,
	SUM("lgotteplosumma"."summagvs")+SUM("lgotteplosumma"."summateplo")*(- 1 ) as summanas
	
FROM
	"public"."contragentteplo" "contragentteplo" 
		INNER JOIN "public"."lgotteplosumma" "lgotteplosumma" 
		ON "contragentteplo"."contragentteplo_id" = "lgotteplosumma".
		"contragentteplo_id" 
			INNER JOIN "public"."period" "period" 
			ON "period"."period_id" = "contragentteplo"."period_id" 

WHERE
	("period"."god" <=  2005 )
GROUP BY
	"period"."god") q1 group by q1.god order by q1.god ) q2

Используй в своих постингах тег SRC. Он может очень приятно преобразить внешний вид твоего сообщения
...
Рейтинг: 0 / 0
помогите с запросом - что-то туплю
    #33766263
4321
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Владимор Конев 4321Вот только порядок...НЕ твоя правда :)
Если можно однозначно задать порядок итоговой выборки, то можно совершенно также ОДНОЗНАЧНО задать порядок вычисления "накопительной суммы", просто условия фильтрации данных в подзапросе расчета накопительной суммы нужно определять соответствующим образом :).???

выдранная вами цитата вообще не имела ничего с подзапросами расчета накопительных сумм.

Она касалась, ежели присмотрецца, некой волатильной фии блаблаблабла (читай те блаблаблабла ф том же топеге, што и драная вами цитата)

т.е. ф-ии вида ~~ (очень примерно, без учета веток инициализации mysession_x и т.п.)

CREATE my_summ(x ) AS'
SELECT mysession_x + x;
' lang sql.
которая бы вызывалась прямо таки так:
SELECT myorder, summ, my_summ(x) FROM t1
WHERE ...
ORDER BY myorder;

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

рассуждение же о гарантиях и их отсутствии касалось порядка выполнения my_summ(x) над строками результирующего набора. В т.ч. в зависимости от условия WHERE , или т.п. (в т.ч. и от того, что из себя представляет t1, или куда вся эта байда потом еще можеть быть втсроена (например джойном).

если ваше возражение касаецца именно такого весьма умозрительного случая (для которого надо нарисовать переменную сессии, ф-ю, и запрос, причем все это сделать нетрудно, вопользовавшись поиском по форуму - все компоненты обсуждались, но лениво - потом еще тестировать совпадает ли порядок вызовов ф-ии с порядком сортровки записей в конечной выборке), то поясните,
если же вы высказывались касательно своих (или еще чьих) многократно считаемых подзапросов (выше по топегу) то -
1. я с ними не спорил, и
2. ну их нафих 3 раза. - Я бы просто дулупную процедуру написал. (Много-много) быстрее должно быть.
...
Рейтинг: 0 / 0
25 сообщений из 31, страница 1 из 2
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / помогите с запросом - что-то туплю
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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