Представьте, что у меня есть таблица с людьми и их функциями:
group Name red_hair tall blue_eyes programmer
1 Mark 1 1 0 1
1 Sean 1 0 1 0
1 Lucas 1 1 1 1
2 Linda 0 1 1 1
Я бы хотел посчитать, сколько людей с определенными c наборами функций в каждой группе. Другими словами, я хотел бы сделать несколько корзин, не считая человека несколько раз.
Есть 2 ^ 4 (16) возможных комбинаций этих наборов, но мне не нужно так много.
Например, если у человека есть рыжие волосы, мне все равно, будет ли он или у нее голубые глаза или он или она программист. Этот человек идет в корзину для красных волос этой группы. Если человек программист, мне все равно, высокий ли он или она, но я не хочу считать людей, которые уже в красном бункере для волос. Потому что я их уже посчитал.
Итак, у меня есть приоритет:
- Красные волосы люди считают первыми
- Программисты вторые
- Люди с голубыми глазами третьи
Ожидаемый результат этого набора данных:
group red_hair_persons programmers blue_eyes_persons
1 3 0 0
2 0 1 0
, когда я сделаю это:
select group, count(case when red_hair = 1 then name end) as red_hair,
count(case when programmer = 1 and red_hair = 0 then name end) as programmers
from table
group by group
Боюсь, что будут некоторые пересечения. Или логика c с CASES была бы настолько сложной, что я мог бы утонуть в ней. Я прав? Если так, как я мог избежать их? Может быть, я делаю все неправильно, и есть лучший способ сделать то, что я хочу. У меня огромный стол со множеством функций, и я не хочу облажаться.