Как получить всю совокупность родительских и дочерних строк в Oracle SQL? - PullRequest
0 голосов
/ 04 мая 2019

У меня есть таблица "TB_Population" с некоторыми записями о населении со всего мира.в настоящее время я хочу вычислить население каждого заголовка в определенной строке и продемонстрировать каждый уровень в этой таблице.

У меня есть эта таблица со следующими данными:

ID     TITLE        PARENT_ID    POPULATION

1      WORLD                         10    
2      AFRICA         1              5  
3      ASIA           1              10
4      EUROPE         1              4
5      GERMANY        4              6
6      FRANCE         4              10
7      ITALY          4              4
8      JAPAN          3              6
9      MORROCO        2              1
10     SPAIN          4              9
11     INDIA          3              8  
12     PORTUGAL       4              2
13     USA            14             10         
14     AMERICA        1              10             
15     NEWYORK        13             5

Ожидаемая таблица вывода должнабыть как ниже

   ID     TITLE     POPULATION       LEVEL

    1      WORLD        100             1   
    2      AFRICA       6               2
    3      ASIA         24              2
    4      EUROPE       35              2
    5      GERMANY      6               3
    6      FRANCE       10              3
    7      ITALY        4               3
    8      JAPAN        6               3
    9      MORROCO      1               3   
    10     SPAIN        9               3
    11     INDIA        8               3
    12     PORTUGAL     2               3
    13     USA          15              3
    14     AMERICA      25              2
    15     NEWYORK      5               4

Спасибо и наилучшими пожеланиями

1 Ответ

1 голос
/ 04 мая 2019

Хитрая часть, которую я вижу здесь, это то, что вы хотите УРОВЕНЬ заголовка от «ВНУТРЬ ВЕРХ» и НАСЕЛЕНИЕ от «ВЕРХНУЮ ВНИЗ». Например, уровень AMERICA должен быть равен 2, что означает, что УРОВЕНЬ должен измеряться с помощью AMERICA -> WORLD, но население AMERICA должно составлять 25, что является суммой населения, измеренного с помощью AMERICA -> NEWYORK. Итак, я попробовал это:

SELECT TOP_TO_BOTTOM.TITLE_ALIAS, TOP_TO_BOTTOM.TOTAL_POPULATION, BOTTOM_TO_TOP.MAX_LEVEL FROM
(SELECT TITLE_ALIAS, SUM(POPULATION) AS "TOTAL_POPULATION" FROM
(SELECT CONNECT_BY_ROOT TITLE AS "TITLE_ALIAS", POPULATION
      FROM TB_POPULATION 
      CONNECT BY PRIOR ID = PARENT_ID) 
GROUP BY TITLE_ALIAS) "TOP_TO_BOTTOM"
INNER JOIN
(SELECT TITLE_ALIAS, MAX(LEV) AS "MAX_LEVEL" FROM
(SELECT CONNECT_BY_ROOT TITLE AS "TITLE_ALIAS", LEVEL AS "LEV"
      FROM TB_POPULATION 
      CONNECT BY PRIOR PARENT_ID = ID) 
GROUP BY TITLE_ALIAS) "BOTTOM_TO_TOP"
ON
BOTTOM_TO_TOP.TITLE_ALIAS = TOP_TO_BOTTOM.TITLE_ALIAS
ORDER BY BOTTOM_TO_TOP.MAX_LEVEL;

Вы можете посмотреть на симуляцию здесь: https://rextester.com/HFTIH47397. Надеюсь, это поможет вам

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