Имею стол attendance
+-----------------------------------------------+
+ p_id | day_1 | day_2 | day_3 | day_4 | day_5 |
+-----------------------------------------------+
+ 1 | P | P | P | A | A |
+ 2 | P | A | A | P | P |
+ 3 | A | A | P | P | P |
+-----------------------------------------------+
Здесь p_id = внешний ключ people.id
И стол people
+------------+
+ id | gend|
+------------+
| 1 | M |
| 2 | F |
| 3 | M |
+------------+
Я хотел бы получить такой окончательный результат, который содержит общее количество отсутствующих с их соответствующим количеством мужчин / женщин:
+---------------------------------------+
+ day | total_a | males | females +
+---------------------------------------+
+ day_1 | 1 | 1 | 0 +
+ day_2 | 2 | 1 | 1 +
+ day_3 | 1 | 0 | 1 +
и так далее
Я не могу понять, с чего начать такой вопрос. Любая помощь приветствуется.
@ Strawberry Да, это была моя первая реакция на проблему. К сожалению, 20 других приложений полагаются на это, изменение схемы будет огромным финансовым фактором. Однако это находится на Фазе 2, постепенно отказываясь от этой ужасающей конструкции БД.
Звучит как огромный, но необходимый фактор затрат.






Похоже, вам нужно развернуть таблицу attendance, затем join и выполнить повторную агрегацию:
select a.day, sum(a.pa = 'P') as total,
sum(a.pa = 'P' and p.gend = 'M') as num_males,
sum(a.pa = 'P' and p.gend = 'F') as num_females
from ((select p_id, day_1 as pa, 'day_1' as day
from attendance a
) union all
(select p_id, day_2, 'day_2' as day
from attendance a
) union all
(select p_id, day_3, 'day_3' as day
from attendance a
) union all
(select p_id, day_4, 'day_4' as day
from attendance a
) union all
(select p_id, day_5, 'day_5' as day
from attendance a
)
) a join
people p
on p.id = a.p_id
group by day
order by day;
Стоп. Измените свою схему.