Форум программистов, компьютерный форум, киберфорум
PostgreSQL
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
1113 / 695 / 111
Регистрация: 10.03.2012
Сообщений: 4,501

Распределение расходов

19.02.2025, 13:51. Показов 438. Ответов 3
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Требуется распределить расходы на электроэнергию по отделам компании пропорционально количеству сотрудников (перечень отделов находится в таблице). Написать функцию, которая примет общую сумму расходов и запишет распределенные расходы в строки таблицы. Числа округляются до копеек; сумма расходов всех отделов должна в точности совпадать с общей суммой.
SQL Скопировано
1
2
3
4
5
6
CREATE TABLE depts(
id INTEGER PRIMARY KEY GENERATED ALWAYS AS IDENTITY,
employees INTEGER,
expenses NUMERIC(10,2)
);
INSERT INTO depts(employees) VALUES (10),(10),(10);
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
19.02.2025, 13:51
Ответы с готовыми решениями:

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

Изменение расходов на продукты
Доброго всем времени суток! Есть таблица продукты и есть таблица расходы на продукты, которые связаны один ко многим. В таблице...

Учет внутриофисных расходов
Здравствуйте, помогите пожалуйста создать базу данных: Описание предметной области --Вы работаете в бухгалтерии частной фирмы. ...

3
 Аватар для Аватар
3908 / 1422 / 499
Регистрация: 31.05.2012
Сообщений: 5,039
19.02.2025, 14:45
количество сотрудников в отделе / количество сотрудников в компании * общая сумма расходов = расход по отделу

Добавлено через 2 минуты
потом можно поиграться с баланесировкой чтобы сумма по отделам совпала с общей суммой расходов.
0
759 / 276 / 57
Регистрация: 01.06.2023
Сообщений: 761
19.02.2025, 22:40
Создаем пользовательскую агрегатную функцию округления с балансировкой

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
31
32
33
34
35
36
CREATE TYPE public.troundfinance AS (
    nerror NUMERIC,
    namount NUMERIC);
    
CREATE OR REPLACE FUNCTION public.roundfinance_final(SELF public.troundfinance)
 RETURNS NUMERIC
 LANGUAGE plpgsql
AS $function$
     BEGIN
       RETURN SELF.nAmount; 
     END;
    $function$
;
 
CREATE OR REPLACE FUNCTION public.roundfinance_transition(SELF public.troundfinance, npvalue NUMERIC, npaccuracy NUMERIC DEFAULT 2)
 RETURNS public.troundfinance
 LANGUAGE plpgsql
AS $function$
     BEGIN
       IF npValue IS NOT NULL THEN
         SELF.nError := SELF.nError + npValue - round(npValue,npAccuracy);
         SELF.nAmount := round(npValue,npAccuracy) + round(SELF.nError,npAccuracy);
         SELF.nError := SELF.nError - round(SELF.nError,npAccuracy);   
       END IF;
       RETURN SELF;
     END;
    $function$
;
 
CREATE OR REPLACE AGGREGATE public.roundfinance(NUMERIC,NUMERIC) (
    SFUNC = public.roundfinance_transition,
    STYPE = public.troundfinance,
    FINALFUNC = public.roundfinance_final,
    FINALFUNC_MODIFY = READ_ONLY,
    INITCOND = '(0,0)'
);
Распределение суммы заданной в :nTotalExpenses пропорционально численности в подразделениях

SQL Скопировано
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
UPDATE depts
SET expenses = t.expenses
FROM 
 (
  SELECT 
   id,
   roundfinance(:nTotalExpenses * employeesTotal / employees, 2) OVER (ORDER BY sign(employees), id) AS expenses 
  FROM
   (
    SELECT 
      id,
      employees,
      SUM(employees) OVER () employeesTotal
    FROM depts
   ) t
 ) t
WHERE 
  depts.id = t.id
Более подробно про пользовательские агрегатные функции можно почитать в статье на хабре
1
1113 / 695 / 111
Регистрация: 10.03.2012
Сообщений: 4,501
20.02.2025, 11:20  [ТС]
SQL Скопировано
1
2
3
4
5
6
CREATE TABLE depts(
id INTEGER PRIMARY KEY GENERATED ALWAYS AS IDENTITY,
employees INTEGER,
expenses NUMERIC(10,2)
);
INSERT INTO depts(employees) VALUES (20),(10),(30);
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
31
CREATE FUNCTION distribute_expenses(amount NUMERIC) RETURNS void AS $$ DECLARE depts_cur CURSOR FOR 
SELECT 
  employees 
FROM 
  depts FOR 
UPDATE 
  ;
total_employees NUMERIC;
expense NUMERIC;
rounding_err NUMERIC := 0.0;
cent NUMERIC;
BEGIN 
SELECT 
  SUM(employees) 
FROM 
  depts INTO total_employees;
FOR dept IN depts_cur LOOP expense := amount * (dept.employees / total_employees);
rounding_err := rounding_err + (
  expense - round(expense, 2)
);
cent := round(rounding_err, 2);
expense := expense + cent;
rounding_err := rounding_err - cent;
UPDATE 
  depts 
SET 
  expenses = round(expense, 2) 
WHERE 
  CURRENT OF depts_cur;
END LOOP;
END $$ VOLATILE LANGUAGE plpgsql;
SQL Скопировано
1
2
SELECT distribute_expenses(100.0);
SELECT * FROM depts;
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
20.02.2025, 11:20
Помогаю со студенческими работами здесь

Сумма расходов материала по проекту
Возникла проблема с выполнением задания. Нужно сделать так, чтобы вывел какой то конкретный id_проекта и сумму его расходов на материалы....

Создать БД "Журнал регистрации расходов в бухгалтерии"
Добрый день, я долго думал над базой данных, но никак не могу её реализовать, помогите пожалуйста. Я бы сделал сам, но я просто не понимаю,...

БД "Учёт внутриофисных расходов"
Нужна база данных на тему ''Учёт внутриофисных расходов''. Что требуется: Вы работаете в бухгалтерии частной фирмы.Сотрудники...

Приход минус расход
Пожалуйста, помогите решить задачу. Нужно сделать отчет, в котором будет выдавать приход, расход, остаток. Название товара берется из одной...

Запрс на накопительный итог по приходу - общий расход
Нужно в БД Аптека сформировать акт о списании средств просроченных лекарств. Т.е., как я понимаю, сначала нужно сделать запрос, в котором...


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

Или воспользуйтесь поиском по форуму:
4
Ответ Создать тему
Новые блоги и статьи
Коммуникация в реальном времени с SignalR в C# на примере создания чата
UnmanagedCoder 17.04.2025
Современный веб стремительно эволюционирует от статичных страниц к динамичным приложениям, где пользователи ожидают мгновенной реакции на свои действия. Представим, что вы отправляете сообщение. . .
Реализация CQRS с MediatR на C# .NET
stackOverflow 17.04.2025
Современная разработка программного обеспечения постоянно ищет пути повышения эффективности организации кода. Архитектурные паттерны появляются, эволюционируют, и те, что проявляют свою. . .
Verilog и интеллектуальная собственность - "глазами" обученной LM модели.
Hrethgir 17.04.2025
В сети встречаются участники, заявляющие что код на Verilog ни о чём не говорит. Но вот патентная практика на самом деле показывает обратное ими утверждаемому. То-есть код на Verilog включают в. . .
Свап-файл дополнительно к разделу (если вдруг не хватает или не создан)
jigi33 17.04.2025
ПОДКЛЮЧЕНИЕ ДОПОЛНИТЕЛЬНОГО SWAP ПРОСТРАНСТВА, Т. О. , РАСШИРЕНИЕ ЕГО РАЗМЕРА В Linux можно использовать как раздел подкачки (swap), так и файл подкачки (swap-файл). Чтобы создать swap-файл вместо. . .
Указатели в Swift: Небезопасные, буферные, необработанные и управляемые указатели
mobDevWorks 16.04.2025
Указатели относятся к наиболее сложным и мощным инструментам языка Swift. В своей сути указатель — это переменная, которая хранит адрес участка памяти, где расположены данные, а не сами данные. . . .
Жизненный цикл HTTP-запросов в ASP.NET Core MVC
UnmanagedCoder 16.04.2025
Разработка веб-приложений на ASP. NET MVC часто выглядит как простой процесс: получили запрос, обработали его в контроллере, отрендерили представление и отправили ответ пользователю. Однако за этой. . .
Введение в Django: Создаём приложение портфолио
py-thonny 16.04.2025
Django – один из самых мощных веб-фреймворков на Python, который позволяет быстро создавать сложные веб-приложения. В отличие от других фреймворков, Django предоставляет богатый набор встроенных. . .
Итераторы в C++: Продвинутые техники использования
bytestream 16.04.2025
Итераторы - одна из самых гибких и выразительных концепций в C++, позволяющих абстрагировать обход элементов контейнера от его внутренней реализации. За прошедшие годы они эволюционировали от простых. . .
Обработка естественного языка в Python с помощью spaCy
py-thonny 16.04.2025
Обработка естественного языка (Natural Language Processing, NLP) — одна из самых быстрорастущих областей искусственного интеллекта, которая позволяет компьютерам понимать, интерпретировать и. . .
Работа с железом в PHP Laravel с Pinout
Jason-Webb 16.04.2025
Граница между программным и аппаратным миром стремительно размывается. Современные веб-приложения уже не ограничиваются цифровым пространством — они активно взаимодействуют с физическими. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru
Выделить код Копировать код Сохранить код Нормальный размер Увеличенный размер