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

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

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

Студворк — интернет-сервис помощи студентам
Требуется распределить расходы на электроэнергию по отделам компании пропорционально количеству сотрудников (перечень отделов находится в таблице). Написать функцию, которая примет общую сумму расходов и запишет распределенные расходы в строки таблицы. Числа округляются до копеек; сумма расходов всех отделов должна в точности совпадать с общей суммой.
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
 Аватар для Аватар
5393 / 1465 / 513
Регистрация: 31.05.2012
Сообщений: 5,153
19.02.2025, 14:45
количество сотрудников в отделе / количество сотрудников в компании * общая сумма расходов = расход по отделу

Добавлено через 2 минуты
потом можно поиграться с баланесировкой чтобы сумма по отделам совпала с общей суммой расходов.
0
912 / 286 / 57
Регистрация: 01.06.2023
Сообщений: 810
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
1192 / 761 / 128
Регистрация: 10.03.2012
Сообщений: 4,922
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
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru