Деление суммы суммы на несколько строк из-за ограничения длины поля - PullRequest
1 голос
/ 12 мая 2019

Я переношу финансовые данные из очень большой таблицы (более 100 миллионов строк), суммируя ее, и вставляя в сводную таблицу.Я столкнулся с проблемой, когда итоговая сумма (3 миллиарда) больше, чем может вместить поле в сводной таблице (может вместить только до 999 миллионов). Изменение размера поля не вариант, так как требует процесса изменения.

Единственный вариант, который у меня есть, - это разделить сумму (которая нарушает ограничение размера) на меньшие, чтобы ее можно было вставить в таблицу.

Я натолкнулся на этот SQL- Мне нужно разделить общее значение на несколько строк в другой таблице , что аналогично, за исключением того, что число строк, которые мне нужно вставить, является динамическим.

Для простоты это может выглядеть как исходная таблица

account_table

acct_num   |      amt
-------------------------------
   101         125.00
   101         550.00
   101         650.00
   101         375.00
   101         475.00
   102          15.00
   103         325.00
   103         875.00
   104         200.00
   104         275.00

Сводные записи таковы:

select acct_num, sum(amt) 
from account_table
group by acct_num

Сводная информация по счету

acct_num   |      amt
-------------------------------
   101        2175.00
   102          15.00
   103        1200.00
   104         475.00

Предполагается, что максимальное значение втаблица назначения равна 1000,00, ожидаемый результат будет

summary_table

acct_num   |      amt
-------------------------------
   101        1000.00
   101        1000.00
   101         175.00
   102          15.00
   103        1000.00
   103         200.00
   104         475.00

Как мне создать запрос, чтобы получить ожидаемый результат?Заранее спасибо.

Ответы [ 2 ]

0 голосов
/ 12 мая 2019

Вариация по этим направлениям может дать некоторые идеи (используя 1000 из ваших выборочных данных):

WITH summary AS (

  SELECT acct_num
        ,TRUNC(SUM(amt) / 1000) AS times
        ,MOD(SUM(amt), 1000) AS remainder
    FROM account_table
    GROUP BY acct_num

), x(acct_num, times, remainder) AS (

  SELECT acct_num, times, remainder
    FROM summary

  UNION ALL

  SELECT s.acct_num, x.times - 1, s.remainder
    FROM summary s
        ,x
    WHERE s.acct_num = x.acct_num
      AND  x.times > 0

)
SELECT acct_num
      ,CASE WHEN times = 0 THEN remainder ELSE 1000 END AS amt
  FROM x
  ORDER BY acct_num, amt DESC

Идея состоит в том, чтобы сначала создать сводную таблицу с помощью div и по модулю:

ACCT_NUM    TIMES   REMAINDER
101         2       175
102         0       15
103         1       200
104         0       475

Затем выполните иерархический запрос к сводной таблице на основе количества «раз» (т. Е. Строк), которое вы хотите, с дополнительным значением для остатка.

ACCT_NUM    AMT
101         1000
101         1000
101         175
102         15
103         1000
103         200
104         475
0 голосов
/ 12 мая 2019

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

with n as (
      select (rownum - 1) as n
      from account_table
      where rownum <= 10
     ),
     a as (
      select acct_num, sum(amt) as amt
      from account_table
      group by acct_num
     ) 
select acct_num,
       (case when (n.n + 1) * 1000 < amt then 1000
             else amt - n.n * 1000
        end) as amt
from a join
     n
     on n.n * 1000 < amt ;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...