Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Развернуть подитоги в столбцы / 3 сообщений из 3, страница 1 из 1
29.09.2020, 07:09
    #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
29.09.2020, 10:08
    #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
29.09.2020, 11:28
    #40003862
ArtHome
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Развернуть подитоги в столбцы
Maxim Boguk, то, что надо, спасибо!
...
Рейтинг: 0 / 0
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Развернуть подитоги в столбцы / 3 сообщений из 3, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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