как посчитать количество дочерних строк по семейству и поместить их в родительские строки в oracle - PullRequest
0 голосов
/ 15 января 2020

У меня есть Oracle база данных, личные данные. У меня есть child_flag от children и family_id для всех членов семьи. что-то вроде:

ID   | birth_date | gender |....| child_flag | family_id
1111 | 2/3/1974   | M      |....| 0          | 1122
1122 | 3/2/1970   | F      |....| 0          | 1122
1133 | 4/4/2000   | F      |....| 1          | 1122
1144 | 5/5/2001   | F      |....| 1          | 1122
1155 | 6/6/2003   | M      |....| 1          | 1122

Я хочу добавить новый столбец, содержащий количество дочерних элементов (child_flag = 1) только для строк родителей (child_flag = 0).

ID   | birth_date | gender |....| child_flag | family_id | childer_num
1111 | 2/3/1974   | M      |....| 0          | 1122      | 3
1122 | 3/2/1970   | F      |....| 0          | 1122      | 3
1133 | 4/4/2000   | F      |....| 1          | 1122      | 0
1144 | 5/5/2001   | F      |....| 1          | 1122      | 0
1155 | 6/6/2003   | M      |....| 1          | 1122      | 0
....

лучший результат, который я получил, был

select *,
case when child_flag=0 then count (ID) over (partition by family_id) else 0 end as chilrden_num
from my_table

Это дает мне 5 в родительской строке и 0 в дочерней строке. Но я хочу считать только ребенка (и получил 3). сокращение 2 от суммы не хорошо, потому что у меня может быть 0 или 1 родительская строка.

есть идеи, как это сделать (желательно без подзапроса)?

Ответы [ 3 ]

2 голосов
/ 15 января 2020

Попробуйте это ниже logi c -

ДЕМО ЗДЕСЬ

SELECT my_table.*,
CASE 
    WHEN child_flag = 0 THEN 
        SUM(
            CASE 
                WHEN child_flag=0 THEN 0 
                ELSE 1 
            END
        ) OVER (PARTITION BY family_id)
    ELSE 0
   END AS chilrden_num
FROM my_table
1 голос
/ 15 января 2020

Если предположить, что child_flag может быть только 0 или 1, логика c может быть упрощена до:

select t.*,
       (case when child_flag = 0
             then sum(child_flag) over (partition by family_id)
        end) as children_num
from my_table t
1 голос
/ 15 января 2020

Сначала добавьте столбец child_num со значением по умолчанию 0, а затем выполните следующий запрос.

merge into my_table A using (select count(*) as child_count,family_id from my_table where child_flag=1 group by family_id) B on (A.family_id=B.family_id)
when matched then update set A.child_num=B.child_count where child_flag=0;

Это даст ожидаемый результат.

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