Ссылка parent-child по значению - PullRequest
0 голосов
/ 06 февраля 2020

У меня есть таблица Account с Account_id в качестве уникального ПК, в этой структуре

Value                Name                                        Account_id
------              -------                                      ----------
1                    Assets                                          100
11                   Fixed Assets                                    101
111                  Furniture and office equipment                  102
1111                 Chairs                                          105
1112                 Computers                                       104
1113                 Air Conditioners                                103
12                   Under-Development Projects                      108
121                  Lands                                           109
122                  Roads and Buildings                             110
1221                 Buildings                                       111
2                    Revenues                                        107
21                   Hotel                                           120
211                  Room                                            122
212                  Sweet                                           123
22                   House                                           125
3                    Liabilities                                     113

and so on...

Счета со значением 11 и 12 ( Основные средства и Незавершенные проекты ) являются субсчетами для значения 1 ( Активы ). Кроме того, учетная запись 111 является субсчетом для 11 , а учетная запись 1111 и 1112 и 1113 являются подчиненными приходится 111 . чтобы понять лучше, мы можем сказать уровень 1, уровень 2, уровень 3 и уровень 4. как это

level1                level2                 level3             level4
   1                    11                    111                1111
                                                                 1112
                                                                 1113
                        12                    121
                                              122                1221
   2                    21                    211
                                              212
                        22

Надеюсь, у вас есть идея.
Теперь у меня есть еще одна таблица Payment для обработки платежей, в этой структуре

Account_id                 Debit               Credit
------------              -------             --------
    105                   500000                 0
    103                   350000                 0
    110                     0                 300000
    105                     0                 300000
    111                   250000                 0
    105                   100000                 0
    111                     0                 400000
    122                   400000                 0
    123                     0                 250000

Примечание: платежи только на уровне 3 и уровне 4
итоговая таблица должна выглядеть следующим образом

Value             Name                                          Amount
------            -----                                        ---------
1                 Assets                                        200,000
11                Fixed Assets                                  650,000
111               Furniture and office equipment                650,000
1111              Chairs                                        300,000
1112              Computers                                        0
1113              Air Conditioners                              350,000
12                Under-Development Projects                   -450,000
121               Lands                                            0
122               Roads and Buildings                          -450,000 
1221              Buildings                                    -150,000
2                 Revenue                                       150,000
21                Hotel                                         150,000
211               Room                                          400,000
212               Sweet                                        -150,000

and so on...

Столбец Сумма является результатом Debit-Credit. Вот краткая
каждая учетная запись покажет полную сумму всех своих дополнительных учетных записей. Например, мебель и офисное оборудование (значение 111) будет:
amount of 111 + amount of 1111 + amount of 1112 + amount of 1113
, что составляет 500000 + 350000-300000 + 100000 = 650000

Ответы [ 2 ]

0 голосов
/ 06 февраля 2020

Использовать подзапрос, сопоставленный с соответствием ведущей подстроки столбца account.value:

SELECT a.*,
       COALESCE(
         ( SELECT SUM( debit - credit )
           FROM   payment p
                  INNER JOIN account ac
                  ON ( p.account_id = ac.account_id )
           WHERE  ac.value LIKE a.value || '%'
         ),
         0
       ) AS amount
FROM   account a

, который выдает:

VALUE | NAME                           | ACCOUNT_ID |  AMOUNT
:---- | :----------------------------- | ---------: | ------:
1     | Assets                         |        100 |  200000
11    | Fixed Assets                   |        101 |  650000
111   | Furniture and office equipment |        102 |  650000
1111  | Chairs                         |        105 |  300000
1112  | Computers                      |        104 |       0
1113  | Air Conditioners               |        103 |  350000
12    | Under-Development Projects     |        108 | -450000
121   | Lands                          |        109 |       0
122   | Roads and Buildings            |        110 | -450000
1221  | Buildings                      |        111 | -150000
2     | Revenues                       |        107 |  150000
21    | Hotel                          |        120 |  150000
211   | Room                           |        122 |  400000
212   | Sweet                          |        123 | -250000
22    | House                          |        125 |       0
3     | Liabilities                    |        113 |       0

дБ <> скрипка здесь

0 голосов
/ 06 февраля 2020

Осталось присоединить платеж к аккаунту, суммы сумм. Используйте эти строки для создания рекурсивного CTE. Начальные точки - это дети, с идентификаторами, которые не являются подстроками других. Затем прикрепите родителей рекурсивно:

with t(value, name, account_id, amount) as (
    select value, name, account_id, sum(debit - credit) 
      from account a 
    natural left join payment p 
    group by account_id, value, name),
  c(value, name, account_id, amount) as (
    select value, name, account_id, amount 
      from t 
      where not exists (select 1 from account where value like t.value||'_' )
    union all
    select t.value, t.name, t.account_id, nvl(c.amount, 0) + nvl(t.amount, 0)
      from t join c on t.value = substr(c.value, 1, length(c.value) - 1))
select value, name, account_id, sum(amount) amount 
  from c 
  group by value, name, account_id
  order by to_char(value)

Демоверсия dbfiddle

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...