Столбец суммы в многотабличной иерархии

Несколько часов назад я задал этот вопрос об иерархии двух таблиц.< /а>

Я сделал новый пост для своего следующего вопроса, так как на мой первоначальный ответ был дан правильный и быстрый. Однако меня попросили не полагаться на другой вопрос, поэтому вот сценарий:

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

    create table areas
(
  id            NUMBER not null,
  name          VARCHAR2(200) not null,
  parent_id     NUMBER
);

-- Top Level
Insert into areas (id, name)
 Values (1, 'Europe');
Insert into areas (id, name)
 Values (2, 'Americas');
Insert into areas (id, name)
 Values (3, 'Asia ex Japan');
Insert into areas (id, name)
 Values (4, 'Japan');

 -- Jurisdictions
Insert into areas (id, name, parent_id)
 Values (5, 'UK', 1);
Insert into areas (id, name, parent_id)
 Values (7, 'France', 1);
Insert into areas (id, name, parent_id)
 Values (6, 'Germany', 1);
Insert into areas (id, name, parent_id)
 Values (8, 'Italy', 1);
Insert into areas (id, name, parent_id)
 Values (9, 'US', 2);
Insert into areas (id, name, parent_id)
 Values (10, 'Australia', 3);
Insert into areas (id, name, parent_id)
 Values (11, 'New Zealand', 3);

create table places
(
  id            NUMBER not null,
  name          VARCHAR2(200) not null,
  area_id       NUMBER,
  parent_id     NUMBER,
  no_of_pubs    NUMBER
);

Insert into places (id, name, area_id, parent_id)
 Values (1, 'London', 5, NULL, 50);
Insert into places (id, name, area_id, parent_id)
 Values (2, 'Bath', 5, NULL, 20);
Insert into places (id, name, area_id, parent_id)
 Values (3, 'Liverpool', 5, NULL, 32);
Insert into places (id, name, area_id, parent_id)
 Values (4, 'Paris', 7, NULL, 64);
Insert into places (id, name, area_id, parent_id)
 Values (5, 'New York', 9, NULL, 76);
Insert into places (id, name, area_id, parent_id)
 Values (6, 'Chicago', 9, NULL, 5);
Insert into places (id, name, area_id, parent_id)
 Values (7, 'Kings Cross', 5, 1, 6);
Insert into places (id, name, area_id, parent_id)
 Values (8, 'Tower of London', 5, 1, 0);

И следующий код для представления данных:

with src as (
  select 'A' type, a.id, a.name, a.parent_id, null area_id from areas a
  union all
  select 'P', -p.id id, p.name, -p.parent_id parent_id, area_id from places p)
select 
  src.*, level
from 
  src
start with 
  type = 'A' and parent_id is null
connect by 
  parent_id = prior id or 
  parent_id is null and area_id = prior id

Со времени последнего поста я изменил таблицу мест, так что каждое «место» теперь имеет столбец «number_of_pubs», как лучше всего рассчитать это в иерархии?

Например, в Великобритании будет 108 пабов, в Лондоне — 56, а на Кингс-Кросс — 6.

Надеюсь, это объясняет, чего я пытаюсь достичь.

Моя текущая идея состоит в том, чтобы передать «тип» и «идентификатор» функции, которая затем обрабатывает результат, перебирая дочерние записи и добавляя пабы.

Прежде чем я начну, есть ли более приятный способ или я на правильном пути?

Изменить: поскольку я опубликовал это, у меня действительно есть функция для работы, но мне было бы интересно посмотреть, возможно ли это с использованием только SQL. Если это не так, я опубликую свое решение, но мне придется его переработать, поскольку мои данные не совпадают с моим примером.

Спасибо еще раз.


person ls_dev    schedule 22.04.2015    source источник
comment
Каждый вопрос должен стоять сам по себе. Это означает, что вы не должны ожидать, что люди прочитают другой пост, чтобы понять, что означает этот вопрос. Пожалуйста, отредактируйте свой вопрос, удалите ссылки на другие вопросы и предоставьте всю информацию, необходимую для ответа на этот вопрос. Спасибо.   -  person Bob Jarvis - Reinstate Monica    schedule 22.04.2015
comment
Спасибо Боб, я отредактировал свой пост.   -  person ls_dev    schedule 22.04.2015
comment
Если мы изменим таблицу мест так, что... ... зачем оставлять нам догадываться, что вам нужно? Почему бы не обновить ваши примеры таблиц и вставить операторы, чтобы показать нам, на что похожа ваша новая структура таблицы, а также опубликовать результат, который вы ожидаете увидеть?   -  person Boneist    schedule 22.04.2015
comment
Добавлена ​​дополнительная информация - я новичок в этом, поэтому отзывы о том, как я публикую, приветствуются!   -  person ls_dev    schedule 22.04.2015


Ответы (1)


Вы можете сделать что-то очень похожее на решение Сандера на первый вопрос; на самом деле используется тот же CTE с добавлением столбца no_of_pubs (хотя некоторые значения, которые он получает, в настоящее время не используются):

with src as (
  select 'A' type, a.id, a.name, a.parent_id, null area_id, 0 no_of_pubs
  from areas a
  union all
  select 'P', -p.id id, p.name, -p.parent_id parent_id, area_id, no_of_pubs
  from places p
)
select s1.name, s1.no_of_pubs, (
    select sum(s2.no_of_pubs)
    from src s2
    start with s2.id = s1.id
    connect by s2.parent_id = prior s2.id
    or (s2.parent_id is null and s2.area_id = prior s2.id)
  ) as rollup_no_of_pubs
from src s1;

Это дает:

NAME                           NO_OF_PUBS ROLLUP_NO_OF_PUBS
------------------------------ ---------- -----------------
Europe                                  0               172
Americas                                0                81
Asia ex Japan                           0                 0
Japan                                   0                 0
UK                                      0               108
France                                  0                64
Germany                                 0                 0
Italy                                   0                 0
US                                      0                81
Australia                               0                 0
New Zealand                             0                 0
London                                 50                56
Bath                                   20                20
Liverpool                              32                32
Paris                                  64                64
New York                               76                76
Chicago                                 5                 5
Kings Cross                             6                 6
Tower of London                         0                 0

У которого есть значения Кингс-Кросс, Лондон и Великобритания, которые вы хотели

демонстрация SQL Fiddle.

person Alex Poole    schedule 22.04.2015
comment
Отлично спасибо! Я совершенно забыл о свертывании. Мне нужно было вспомнить удивительный пример зоомагазина - person ls_dev; 22.04.2015