powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Математика. Разделение числа пропорционально набору других чисел.
3 сообщений из 3, страница 1 из 1
Математика. Разделение числа пропорционально набору других чисел.
    #39487872
anvano
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Есть некоторая сумма, целая: R=2000

Есть набор дробных чисел с разным числом знаков после запятой:

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
WITH t AS(
  SELECT 521.374   FROM DUAL UNION ALL
  SELECT 304.63    FROM DUAL UNION ALL
  SELECT 1240.2123 FROM DUAL UNION ALL
  SELECT 707.11    FROM DUAL UNION ALL
  SELECT 802.5     FROM DUAL 
)
SELECT * FROM t



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

На PL/SQL он довольно компактно выглядит так:

Код: plsql
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.
DECLARE
  R  NUMBER;
  Ri NUMBER;
  T  NUMBER;
BEGIN  
  
  R := 2000;      -- Число, которое надо распределить
  T := 3575.8263; -- Просто общая сумма набора чисел из селекта

  FOR i IN(
    WITH t(amount) AS(
      SELECT 521.374   FROM DUAL UNION ALL
      SELECT 304.63    FROM DUAL UNION ALL
      SELECT 1240.2123 FROM DUAL UNION ALL
      SELECT 707.11    FROM DUAL UNION ALL
      SELECT 802.5     FROM DUAL 
    )
    SELECT t.amount FROM t
  ) LOOP

    Ri :=  ROUND( R * i.amount / T );
    
    R := R - Ri;
    T := T - i.amount;    
    
    dbms_output.put_line('Для числа '||i.amount||' отщепили '||Ri);
  END LOOP;  
END;



Результат:
Код: plaintext
1.
2.
3.
4.
Для числа 521.374   отщепили 292
Для числа 304.63    отщепили 170
Для числа 1240.2123 отщепили 694
Для числа 707.11    отщепили 395
Для числа 802.5     отщепили 449


Вопрос:
Можно ли эту логику это как-то реализовать SQL запросом без PL/SQL?
Чтобы имея число целое (2000) и табличку из дробных чисел, рядом с каждым дробным числом получить сколько на него приходится от этого целого числа.

ЧислоОтщепили521.374292304.631701240.2123694707.11395802.5449

--------------------------------------------------------------
Запомните, товарищи офицеры, чтобы ничего не делать, надо уметь делать все.
...
Рейтинг: 0 / 0
Математика. Разделение числа пропорционально набору других чисел.
    #39487885
booby
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
начни отсюда.
если нужно в целых и с переносом разницы на наибольшее - потребуются следующие этажи
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
    WITH t(amount) AS(
      SELECT 521.374   FROM DUAL UNION ALL
      SELECT 304.63    FROM DUAL UNION ALL
      SELECT 1240.2123 FROM DUAL UNION ALL
      SELECT 707.11    FROM DUAL UNION ALL
      SELECT 802.5     FROM DUAL 
    )
    SELECT t.amount, 
    , 2000*ratio_to_report(t.amount) over()
    FROM t;
...
Рейтинг: 0 / 0
Математика. Разделение числа пропорционально набору других чисел.
    #39487886
booby
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
booby,

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
    WITH t(amount) AS(
      SELECT 521.374   FROM DUAL UNION ALL
      SELECT 304.63    FROM DUAL UNION ALL
      SELECT 1240.2123 FROM DUAL UNION ALL
      SELECT 707.11    FROM DUAL UNION ALL
      SELECT 802.5     FROM DUAL 
    )
    SELECT t.amount 
    , 2000*ratio_to_report(t.amount) over()
    FROM t;
...
Рейтинг: 0 / 0
3 сообщений из 3, страница 1 из 1
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Математика. Разделение числа пропорционально набору других чисел.
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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