Гость
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Как написать пользовательскую агрегатную функцию? / 4 сообщений из 4, страница 1 из 1
18.07.2021, 22:19
    #40084539
diagirl
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как написать пользовательскую агрегатную функцию?
Добрый день!
Подскажите, пожалуйста, есть таблица с полями client, summa, condition (условие: выдача или погашение кредита). Поле client не уникально, то есть для каждого клиента несколько операций. Необходимо для каждого клиента посчитать, какая сумма осталась к погашению, то есть если в condition выдача, то значение из поля summa должно прибавляться, если погашение, то вычитаться.
Написала функцию, которая делает это

CREATE OR REPLACE FUNCTION rest_debt (
summa NUMBER,
condition VARCHAR2,
stat1 VARCHAR2 DEFAULT 'Выдача кредита',
stat2 VARCHAR2 DEFAULT 'Погашение кредита')
RETURN NUMBER IS
rest NUMBER := 0;
BEGIN
IF condition = stat1 THEN rest := rest+summa;
ELSIF condition = stat2 THEN rest := rest+summa;
ELSE rest := rest;
END IF;
RETURN rest;
END rest_debt;

но при использовании ее в SELECT, она работает для каждой строки отдельно, при использовании GROUP BY возникает ошибка Выражение не является выражением GROUP BY. Как сделать, чтобы она считала именно по группе? Или может есть другие варианты решения такой задачи?
...
Рейтинг: 0 / 0
18.07.2021, 22:45
    #40084542
SY
SY
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как написать пользовательскую агрегатную функцию?
diagirl,

А зачем тут функция?

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
SELECT  CLIENT,
        SUM(
            CASE CONDITION
              WHEN 'Выдача кредита' THEN SUMMA
              WHEN 'Погашение кредита' THEN -SUMMA
            END
           )
  FROM  YOUR_TABLE
  GROUP BY CLIENT
/



SY.
...
Рейтинг: 0 / 0
19.07.2021, 09:26
    #40084572
Никанор Кузьмич
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как написать пользовательскую агрегатную функцию?
diagirl
Код: plsql
1.
2.
IF condition = stat1 THEN rest := rest+summa;
ELSIF condition = stat2 THEN rest := rest+summa;

Какой хороший у вас банк! Не буду брать у вас кредит. Так, на всякий случай

Пользовательскую агрегатную функцию писать немного сложнее, чем вы думаете. Примерно так: Using User-Defined Aggregate Functions Но в целом, не очень сложно.
Хотя для ваших целей она не нужна, см. пример выше.
...
Рейтинг: 0 / 0
19.07.2021, 10:59
    #40084594
diagirl
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как написать пользовательскую агрегатную функцию?
SY,
Все было так просто, спасибо)
...
Рейтинг: 0 / 0
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Как написать пользовательскую агрегатную функцию? / 4 сообщений из 4, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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