Иерархическая связь данных с аналитической функцией - PullRequest
3 голосов
/ 14 февраля 2012

Этот вопрос связан с моим предыдущим постом, оригинальная таблица, как показано ниже

Customer_ID   Account_ID     Paying_Account_ID    Parent_Account_ID    Company_ID
 158            158             158                  158                     0
 159            159             158                  158                     0
 160            160             158                  158                     0
 181            181             181                  181                     0
 183            183             183                  183                     0
 24669          24669           24669                24669                   0         
 24671          24671           24671                24669                   0
 24670          24670           24670                24669                   0     
 3385127        3385127         3385127              24670                   0

Чтобы определить иерархические отношения данных, которые PARENT_ACCOUNT_ID и ACCOUNT_ID, ниже приведен запрос, который я использовал.

SELECT lpad(' ', 2*level) || A.ACCOUNT_ID AS LEVEL_LABEL,
       CONNECT_BY_ISCYCLE "Cycle",
       LEVEL,
       A.*
FROM   ACCOUNT A
START WITH parent_account_id = account_id
CONNECT BY NOCYCLE PRIOR A.ACCOUNT_ID = A.PARENT_ACCOUNT_ID AND
        account_id <> parent_account_id;

Это результат запроса

Level_Label Level CustomerID AccountID Paying_AccountID Parent_AccountID CompanyID
  158          1       158        158           158          158             0
    159        2       159        159           158          158             0
    160        2       160        160           158          158             0
  181          1       181        181           181          181             0
  183          1       183        183           183          183             0
  24669        1       24669      24669         24669        24669           0       
    24671      2       24671      24671         24671        24669           0
    24670      2       24670      24670         24670        24669           0         
     3385127   3       3385127    3385127       3385127      3385127         0  

У меня вопрос, как я могу изменить запрос, чтобы вычислить значения для:

  • My_Total_PR - Количество моих детских PR-аккаунтов, которые не включают себя.
  • Total_PR - Общее количество PR-аккаунтов в общей структуре
  • My_Total_NPR - Количество моих дочерних учетных записей NPR, которое не включает себя.
  • Total_NPR - Общее количество учетных записей NPR в общей структуре

PR означает Ответственный за платеж, например, платеж, ответственный за Счет 158, составляет 158 (Paying_Account_ID), поэтому Total_PR для 158 составляет 3 (158, 159, 160) * 1028. * NPR означает «Ответственный за неоплату», например, платеж, ответственный за Счет 159, равен 158 (Paying_Account_ID), поэтому Total_NPR для 159 равен 1.

Это ожидаемый результат, любой совет будет высоко ценится. Спасибо!

Level_Label Level Cycle My_Total_PR Total_PR  My_Total_NPR Total_NPR Paying_Account
 158          1      0       2         3          0              0        158
   159        2      0       0         0          0              1        158
   160        2      0       0         0          0              1        158
 181          1      0       0         1          0              0        181
 183          1      0       0         1          0              0        183
 24669        1      0       0         1          3              3        24669  
   24671      2      0       0         1          0              0        24671
   24670      2      0       0         1          1              1        24670
    3385127   3      0       0         1          0              0        3385127

1 Ответ

0 голосов
/ 26 апреля 2013

"Всего" запросов IMO нет места в вашем запросе, потому что они не специфичны для учетной записи. Я бы не пытался втиснуть их в ваш запрос, а написал бы отдельные запросы для них.

Однако «мои» запросы относятся только к аккаунту (или customer_id?). Мой общий подход был бы следующим:

Попробуйте написать запрос, который отвечает на конкретный вопрос (например, Количество моих дочерних PR-аккаунтов, которые не включают себя ) для одного данного аккаунта. Без сомнения, этот запрос будет содержать предложение типа "and account_id = 158".

Тогда вы можете сделать две вещи:

Либо вы удалите это предложение и убедитесь, что account_id выставлен. Затем запрос ответит на ваш вопрос для всех учетных записей. Затем вы можете объединить этот выбор с вашим иерархическим запросом, как в

select ...
from 
    (treeQuery) t,
    (myQuery) m
where
    t.account_id = m.account_id;

Или, в качестве альтернативы, поскольку «мои» запросы возвращают только одно значение, вы можете использовать их в проекции. как в

select
    (select myQuery where account_id = t.account_id) alias1,
     t.* -- or whatever columns you want to see
from
    treeQuery t;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...