Как найти счетчик по столбцам, имеющий определенное значение

Имею стол 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 19.10.2018 12:39

@ Strawberry Да, это была моя первая реакция на проблему. К сожалению, 20 других приложений полагаются на это, изменение схемы будет огромным финансовым фактором. Однако это находится на Фазе 2, постепенно отказываясь от этой ужасающей конструкции БД.

Aniket Inge 19.10.2018 13:03

Звучит как огромный, но необходимый фактор затрат.

Strawberry 19.10.2018 14:28
Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для разработчиков
Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для разработчиков
В последние годы архитектура микросервисов приобрела популярность как способ построения масштабируемых и гибких приложений. Laravel , популярный PHP...
Как построить CRUD-приложение в Laravel
Как построить CRUD-приложение в Laravel
Laravel - это популярный PHP-фреймворк, который позволяет быстро и легко создавать веб-приложения. Одной из наиболее распространенных задач в...
Освоение PHP и управление базами данных: Создание собственной СУБД - часть II
Освоение PHP и управление базами данных: Создание собственной СУБД - часть II
В предыдущем посте мы создали функциональность вставки и чтения для нашей динамической СУБД. В этом посте мы собираемся реализовать функции обновления...
Документирование API с помощью Swagger на Springboot
Документирование API с помощью Swagger на Springboot
В предыдущей статье мы уже узнали, как создать Rest API с помощью Springboot и MySql .
Роли и разрешения пользователей без пакета Laravel 9
Роли и разрешения пользователей без пакета Laravel 9
Этот пост изначально был опубликован на techsolutionstuff.com .
Как установить LAMP Stack - Security 5/5 на виртуальную машину Azure Linux VM
Как установить LAMP Stack - Security 5/5 на виртуальную машину Azure Linux VM
В предыдущей статье мы завершили установку базы данных, для тех, кто не знает.
0
3
31
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Похоже, вам нужно развернуть таблицу 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;

Другие вопросы по теме