powered by simpleCommunicator - 2.0.52     © 2025 Programmizd 02
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Развернуть подитоги в столбцы
3 сообщений из 3, страница 1 из 1
Развернуть подитоги в столбцы
    #40003738
ArtHome
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Если подобная тема была, подскажите пожалуйста, а то даже не понимаю, как гуглить.

У меня есть таблица, в которой для каждого объекта CostBase есть пара десятков номеров счетов с суммами. Это выглядит примерно так
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
CostBase | Account | Cost
1        | 1       | 22
1        | 2       | 999
1        | 3       | 25
...
2        | 1       | 34
...

На выходе мне надо получить таблицу, где в строках также останутся CostBase и Cost, а разные Account будут в столбцах - то есть на один CostBase будет одна строка.
Код: plaintext
1.
2.
3.
4.
CostBase | Acc1 | Acc2 | Acc3 | ...
1        | 22   | 999  | 25   | ...
2        | 34   | 456  | 77   | ...
...


Для этого я написал функцию, которая возвращает по заданным в качестве аргументам CostBase и Account сумму по Cost
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
CREATE OR REPLACE FUNCTION public."AccountCost"(IN "ACC" character varying,IN "CB" character varying)
    RETURNS money
    LANGUAGE 'sql'
    VOLATILE
    PARALLEL UNSAFE
    COST 100
AS $BODY$
SELECT SUM("COST") FROM GL31
WHERE "ACCOUNT"=$1 AND "CostBase"=$2;
$BODY$;



Далее я получаю нужный мне результат через запрос
Код: plsql
1.
2.
3.
4.
5.
6.
7.
SELECT DISTINCT "CostBase", 
"AccountCost"(1, "CostBase") as fzp_rup,
"AccountCost"(2, "CostBase") as fzp2_rur,
"AccountCost"(3, "CostBase") as fmp_rup
--...

FROM GL31 ORDER BY "CostBase";


Понятно, что всё это работает довольно-таки медленно и меня не покидает ощущение, что помимо решения в лоб есть варианты лучше. Подскажите, я выбрал оптимальный подход и дальше играть с индексами и materialized veiw или всё сделано задом наперед?
...
Рейтинг: 0 / 0
Развернуть подитоги в столбцы
    #40003805
Фотография Maxim Boguk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ArtHome,

Если вам нужна скорость - забудьте маленькие хранимые процедуры и пишите в один запрос (легко можно получить ускорение на пару порядков)
А запрос уже можно оптимизировать по разному.
overhead на 1 вызов функции в pg очень дорогой да и оптимизировать это не возможно в отличии от запроса.


вам надо обычный group by + https://www.postgresql.org/docs/13/tablefunc.html для pivot результата

--
Maxim Boguk
лучшая поддержка PostgreSQL: dataegret.ru
...
Рейтинг: 0 / 0
Развернуть подитоги в столбцы
    #40003862
ArtHome
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Maxim Boguk, то, что надо, спасибо!
...
Рейтинг: 0 / 0
3 сообщений из 3, страница 1 из 1
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Развернуть подитоги в столбцы
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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