Считать людей в компаниях в древовидной структуре - PullRequest
0 голосов
/ 04 июня 2018

Здравствуйте. У меня есть структурная таблица со столбцами companies_id (PK) и parent_companies_id (FK), а также таблица людей с companies_id (FK) и people_id (PK).Некоторые люди могут быть в разных компаниях.Я хочу посчитать количество каждой компании, включая ребенка.

+------------------+-------------------------+
| companies_id(PK) | parent_companies_id(FK) |
+------------------+-------------------------+
|              101 | null                    |
|              102 | 101                     |
|              103 | 101                     |
|              104 | 103                     |
|              105 | 103                     |
|              106 | 104                     |
+------------------+-------------------------+

+---------------+------------------+
| people_id(PK) | companies_id(FK) |
+---------------+------------------+
|           001 |              101 |
|           002 |              102 |
|           003 |              102 |
|           004 |              104 |
|           005 |              105 |
|           006 |              106 |
+---------------+------------------+

CREATE TABLE COMPANY
  ( Company_ID Integer,
    Parent_ID Integer
  );

CREATE TABLE PEOPLE
  ( People_ID VARCHAR(3),
    Company_ID Integer
  );

INSERT INTO COMPANY VALUES (101,NULL);
INSERT INTO COMPANY VALUES (102,101);
INSERT INTO COMPANY VALUES (103,101);
INSERT INTO COMPANY VALUES (104,103);
INSERT INTO COMPANY VALUES (105,103);
INSERT INTO COMPANY VALUES (106,104);

INSERT INTO PEOPLE VALUES ('001',101);
INSERT INTO PEOPLE VALUES ('002',102);
INSERT INTO PEOPLE VALUES ('003',102);
INSERT INTO PEOPLE VALUES ('004',104);
INSERT INTO PEOPLE VALUES ('005',105);
INSERT INTO PEOPLE VALUES ('006',106);

Результат должен быть следующим

+--------------+------------+
| companies_id | people_qnt |
+--------------+------------+
|          101 |          6 |
|          102 |          2 |
|          103 |          3 |
|          104 |          2 |
|          105 |          1 |
|          106 |          1 |
+--------------+------------+

1 Ответ

0 голосов
/ 04 июня 2018

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

select struct.companies_id, count(people_id)
from struct
inner join people on people.companies_id in 
        (select s2.companies_id
         from struct s2
         start with s2.companies_id = struct.companies_id
         connect by prior s2.companies_id = s2.parent_companies_id)
group by struct.companies_id
order by 1
;

Sqlfiddle

...