Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Математика. Разделение числа пропорционально набору других чисел. / 3 сообщений из 3, страница 1 из 1
12.07.2017, 20:47
    #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
12.07.2017, 21:08
    #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
12.07.2017, 21:09
    #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
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Математика. Разделение числа пропорционально набору других чисел. / 3 сообщений из 3, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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