Форум программистов, компьютерный форум, киберфорум
PostgreSQL
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.88/8: Рейтинг темы: голосов - 8, средняя оценка - 4.88
0 / 0 / 0
Регистрация: 16.04.2023
Сообщений: 16

Функции в postgre sql

16.10.2023, 23:41. Показов 1945. Ответов 27
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте, были созданы таблицы
SQL
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
CREATE TABLE stack.Accounts
 
CREATE TABLE stack.Counters
 
CREATE TABLE stack.Meter_Pok
Нужно было написать 3 функции, 2 из них я написал и все работает нормально, но 3 функция выполняет запрос, но выдаёт столбцы без значений 
CREATE OR REPLACE FUNCTION stack.select_value_by_house_and_month(house_number INT, month_ DATE)
RETURNS TABLE (acc INT, name text, VALUE INT) AS
$$
DECLARE
    RESULT RECORD;
BEGIN
    FOR RESULT IN
        SELECT A.number, C.name, SUM(M.value)::INT AS VALUE
        FROM stack.Accounts A
        JOIN stack.Counters C ON C.acc_id = A.row_id
        JOIN stack.Meter_Pok M ON M.counter_id = C.row_id
        WHERE A.type = 1 AND CAST(A.number AS text) LIKE (CAST(house_number AS text) || '%')
            AND EXTRACT(MONTH FROM M.month) = EXTRACT(MONTH FROM month_)
        GROUP BY A.number, C.name
        ORDER BY A.number, C.name
    LOOP
        acc := RESULT.number;
        name := RESULT.name;
        VALUE := RESULT.value;
        RETURN NEXT;
    END LOOP;
    RETURN;
END;
$$ LANGUAGE plpgsql;
что не так ?
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
16.10.2023, 23:41
Ответы с готовыми решениями:

Ошибка при выполнении функции по подсчету времени на Postgre SQL
Всем привет! Помогите пожалуйста разобраться с ошибкой при выполнении функции по подсчету рабочего времени. Создала функцию, код...

Функция по подсчету рабочего времени на Postgre SQL
Всем привет! Помогите пожалуйста разобраться с функцией по подсчету рабочего времени. Функция при подстановке любых дат всегда выдает...

PostGre SQL 9_3_4_1_1C - не пускает под postgres
Доброе время суток. Установил вышеуказанную версию PostGreSQL, сборка от 1С. Системному пользователю postgres установил пароль: passwd...

27
Нарушитель
110 / 86 / 32
Регистрация: 10.05.2023
Сообщений: 323
17.10.2023, 00:25
ваша третья функция stack.select_value_by_house_and_month выполняет запрос, но не возвращает значения столбцов. Нверное, проблема заключается в том, что вы не правильно определили переменные acc, name и value внутри функции.
Вместо использования простых переменных, вы должны использовать переменные, определенные возвращаемым типом таблицы. в вашем случае, возвращаемый тип таблицы определен как (acc int, name text, value int). Поэтому, вместо acc := result.number, name := result.name и value := result.value, вам следует использовать acc := result.acc, name := result.name и value := result.value.
0
0 / 0 / 0
Регистрация: 16.04.2023
Сообщений: 16
17.10.2023, 00:32  [ТС]
изменил, но все равно тоже самое
Миниатюры
Функции в postgre sql  
0
912 / 286 / 57
Регистрация: 01.06.2023
Сообщений: 807
17.10.2023, 05:24
Попробуйте вместо цикла вернуть запрос

SQL
1
2
3
4
5
6
7
8
9
10
11
BEGIN
RETURN query SELECT A.number, C.name, SUM(M.value)::INT AS VALUE
FROM stack.Accounts A
JOIN stack.Counters C ON C.acc_id = A.row_id
JOIN stack.Meter_Pok M ON M.counter_id = C.row_id
WHERE A.type = 1 AND CAST(A.number AS text) LIKE (CAST(house_number AS text) || '%')
AND EXTRACT(MONTH FROM M.month) = EXTRACT(MONTH FROM month_)
GROUP BY A.number, C.name
ORDER BY A.number, C.name;
RETURN;
END;
Добавлено через 12 минут
Проверьте отдельно запрос возможно он выдает пусто
1
Нарушитель
110 / 86 / 32
Регистрация: 10.05.2023
Сообщений: 323
17.10.2023, 11:00
Цитата Сообщение от max200340 Посмотреть сообщение
изменил, но все равно тоже самое
скинь пожалуйста код если не решена проблема, попробую отладить...
1
0 / 0 / 0
Регистрация: 16.04.2023
Сообщений: 16
17.10.2023, 12:59  [ТС]
SQL
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
CREATE OR REPLACE FUNCTION stack.select_value_by_house_and_month(house_number INT, month_ DATE)
RETURNS TABLE (acc INT, name text, VALUE INT) AS
$$
DECLARE
    RESULT RECORD;
BEGIN
RETURN query SELECT A.number, C.name, SUM(M.value)::INT AS VALUE
FROM stack.Accounts A
JOIN stack.Counters C ON C.acc_id = A.row_id
JOIN stack.Meter_Pok M ON M.counter_id = C.row_id
WHERE A.type = 1 AND CAST(A.number AS text) LIKE (CAST(house_number AS text) || '%')
AND EXTRACT(MONTH FROM M.month) = EXTRACT(MONTH FROM month_)
GROUP BY A.number, C.name
ORDER BY A.number, C.name;
RETURN;
END;
$$ LANGUAGE plpgsql;
Вложения
Тип файла: zip sql.zip (582 байт, 25 просмотров)
0
0 / 0 / 0
Регистрация: 16.04.2023
Сообщений: 16
17.10.2023, 16:37  [ТС]
сможете помочь ?
0
912 / 286 / 57
Регистрация: 01.06.2023
Сообщений: 807
17.10.2023, 16:58
Вы проверили отдешьно запрос? Он возвращает результат? С return query тот же самый результат?
0
0 / 0 / 0
Регистрация: 16.04.2023
Сообщений: 16
17.10.2023, 17:43  [ТС]
проверил, ничего не возвращает ни запрос ни return query
0
912 / 286 / 57
Регистрация: 01.06.2023
Сообщений: 807
17.10.2023, 17:46
значит работает верно. и у Вас нет данных что бы что то вернуть, проверьте еще раз запрос, возможно с другими параметрами будет нужный результат
0
0 / 0 / 0
Регистрация: 16.04.2023
Сообщений: 16
17.10.2023, 17:49  [ТС]
просто мне дали задание, и там есть пример вывода функции и запрос. Его пишу и ничего не выводит, а должны выводится значения
0
912 / 286 / 57
Регистрация: 01.06.2023
Сообщений: 807
17.10.2023, 17:52
Значит не правильно пишете, если хотите что помогли нужно предоставить описание БД и текст задания. У форумчан нынче телепатические каналы сбоят
1
0 / 0 / 0
Регистрация: 16.04.2023
Сообщений: 16
17.10.2023, 17:58  [ТС]
Даны таблицы

---------------------------------------------------------------------------------------------------

-- Лицевые счета. Иерархическая таблица. лицевой счет ссылается на квартиру, квартира на дом.
-- в квартире/доме может быть несколько лицевых, лицевой может быть привязан к дому
SQL
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
CREATE TABLE stack.Accounts
(
   row_id INT GENERATED ALWAYS AS IDENTITY ,
   parent_id INT,                         -- row_id родительской записи
   NUMBER INT,                            -- Номер лицевого счета
   TYPE INT,                              -- Тип записи (1 - Дом, 2- Квартира, 3 - Лицевой счет)
 
   CONSTRAINT PK_Accounts
      PRIMARY KEY (row_id),
   CONSTRAINT FK_Accounts_Folder 
      FOREIGN KEY (parent_id) 
      REFERENCES stack.Accounts(row_id)
      ON DELETE no action
      ON UPDATE no action
);
-- Счетчики
SQL
1
2
3
4
5
6
7
8
9
10
11
12
13
14
CREATE TABLE stack.Counters
(
   row_id INT GENERATED ALWAYS AS IDENTITY ,
   name text NOT NULL,       -- Наименование счетчика
   acc_id INT,                        -- row_id Лицевого
   service INT NOT NULL,              -- Услуга (100 - Холодная вода / 200 - Горячая Вода / 300 - Электричество /400 - Отопление)
   tarif INT NOT NULL,                -- Тарифность счетчика (1,2,3) (Показания по скольким тарифам могут быть на счетчике 
 
   CONSTRAINT PK_Counters
      PRIMARY KEY (row_id),
   CONSTRAINT FK_Counters
      FOREIGN KEY (acc_id)
      REFERENCES stack.Accounts(row_id)
);
-- Показания счетчиков
-- В таблице хранятся показаний счетчика за расчетный месяц. Показание в месяце может остутстовать , возможен случай 2 и более показаний по счетчику. в этом случае суммарное потребление это сумма расходов всех показаний за месяц.
-- Тариф используется для учета потребления в определенный момент дня (день/ночь - для 2-х тарифного ) (пик,полупик,ночь - для 3-х тарифного) суммарным расходом по лицевому за месяц будет сумма расхода по всем тарифам счетчика
-- Поле дата хранит в себе дату показаний , необходимо для определения последнего показания . при наличии 2 и более показаний в 1 месяце.
SQL
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
CREATE TABLE stack.Meter_Pok
(
   row_id INT GENERATED ALWAYS AS IDENTITY ,
   acc_id INT,                             -- row_id Лицевого
   counter_id INT,                         -- row_id счетчика
   VALUE INT NOT NULL,                     -- Расход 
   DATE DATE NOT NULL,                     -- Дата показания
   MONTH DATE NOT NULL,                    -- Месяц показания
   tarif INT NOT NULL,                     -- Тариф (для 1 тарифного счетчика = 0 ; для 2 тарифного счетчика = 0 или 1 ; для 3 тарифного счетчика = 0 или 1 или 2 )
 
   CONSTRAINT PK_Meter_Pok
      PRIMARY KEY  (row_id),
   CONSTRAINT FK_Meter_Acc
      FOREIGN KEY (acc_id) 
      REFERENCES stack.Accounts(row_id) ,
   CONSTRAINT FK_Meter_Counters
      FOREIGN KEY (counter_id) 
      REFERENCES stack.Counters(row_id)
);
== Задание 2

Написать функцию select_value_by_house_and_month. Она получает номер дома и месяц
и возвращает все лицевые в этом доме , для лицевых выводятся все счетчики с сумарным расходом за месяц ( суммирую все показания тарифов)
Результатом вызова
функции должна быть таблица с 3 колонками:

- acc (Лицевой счет)
- name (Наименование счетчика)
- value (Расход)

Примеры вызова функции:
SQL
1
2
3
4
5
6
7
8
9
10
11
12
SELECT * FROM stack.select_value_by_house_and_month(1,'20230201')
--number|name|value
--111   Счетчик на воду    150
--111   Счетчик на отопление  -50
--111   Счетчик на электричество  80
--122   Счетчик на воду    105
--122   Счетчик на отопление  0
--133   Счетчик на воду    900
--133   Счетчик на отопление  -1
--144   Счетчик на воду    0
--144   Счетчик на отопление  10
--144   Счетчик на электричество  100
0
912 / 286 / 57
Регистрация: 01.06.2023
Сообщений: 807
17.10.2023, 18:10
в stack.Meter_Pok value расход (дельта) с предыдущего показания или текущее абсолютное показание?
0
0 / 0 / 0
Регистрация: 16.04.2023
Сообщений: 16
17.10.2023, 18:13  [ТС]
Вроде текущее показание
0
912 / 286 / 57
Регистрация: 01.06.2023
Сообщений: 807
17.10.2023, 18:17
По ошибкам запроса:

- не нужно использовать условие like при поиске номера дома. что передали то и ищем
- JOIN stack.Counters C ON C.acc_id = A.row_id - не верное соединение A.row_id - это ид дома а не счета, что бы дойти до счета нужно сделать еще несколько соединений с stack.Accounts
- EXTRACT(MONTH FROM M.month) = EXTRACT(MONTH FROM month_) если правильно понял условие задачи то в M.month уже хранится дата округленная до месяца, нужно сравнивать с переданной датой m.month = date_trunc('MONTHS', month_)
- если value текущее то нужно взять последнее значение а не сумму

С такими вводными попробуете еще раз написать запрос? или готовый ответ?
0
0 / 0 / 0
Регистрация: 16.04.2023
Сообщений: 16
17.10.2023, 18:25  [ТС]
Можете прислать готовый? буду благодарен. Сам пока тоже попробую изменить с учётом замечаний
0
912 / 286 / 57
Регистрация: 01.06.2023
Сообщений: 807
17.10.2023, 18:30
а проверьте, пожалуйста в таблице VALUE вообще есть отрицательные значения?
0
0 / 0 / 0
Регистрация: 16.04.2023
Сообщений: 16
17.10.2023, 18:39  [ТС]
Да, есть отрицательные значения
0
912 / 286 / 57
Регистрация: 01.06.2023
Сообщений: 807
17.10.2023, 18:48
Без проверки может где и не правильно написано, но думаю для понимания сути будет достаточно:

Кликните здесь для просмотра всего текста
SQL
1
2
3
4
5
6
7
8
9
10
11
12
13
14
SELECT 
  Accounts.number,
  Counters.name,
  COALESCE(SUM(Meter_Pok.value), 0) AS VALUE
FROM 
  stack.Accounts tHouse
  INNER JOIN stack.Accounts tFlat ON tFlat.parent_id = tHouse.row_id
  INNER JOIN stack.Accounts ON Accounts.parent_id = tFlat.row_id --Здесь подразумевается что иерархия не изменится и на третьем уровне всегда будут счета
  INNER JOIN stack.Counters ON Counters.acc_id = Accounts.row_id
  LEFT JOIN stack.Meter_Pok ON  -- left на случае если показаний нет
    Meter_Pok.counter_id = Counters.row_id
    Meter_Pok.month = date_trunc('MONTHS', :MONTH) --На всякий случай округлим до месяца
WHERE tHouse.number = :NUMBER AND tHouse.type = 1
GROUP BY Accounts.number, Counters.name
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
17.10.2023, 18:48
Помогаю со студенческими работами здесь

Перевод функции с MS SQL на Postgre SQL
Всем привет! Помогите пожалуйста найти ошибку в функции по подсчету рабочего времени. На данный момент, функция при подстановке любых...

Выполнить три запроса подряд к Postgre SQL
Доброе утро. мне надо открыть сессию, сделать апдейт таблицы и закрыть сессию. если делать в PgAdmin, DBeaver, то получается ( в первом...

Подскажите как переконвертировать реляционную схему из visio в sql для Postgre
Подскажите, пожалуйста, как автоматически переконвертировать реляционную схему из visio в sql, желательно для Postgre. Спасибо большое.

Json в Postgre
День добрый. Может кто-нибудь подкинуть кода(или ссылку на статью) как быстро и правильно положить Json файл в PostgreSQL БД.

Postgre+php
Здравствуйте! Подскажите, как можно заполнить таблицу в postgres через php? То есть мне нужно чтобы данные заполнялись в колонки в postgres...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Access
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru