I made generic SQL:
select
'Total Estudantes' as Resultado, count(*) as Total
from
ESTUDANTES_IDENTIFICACAO
union
select
CONCAT('Sexo ', b.sexo), count(*)
from
ESTUDANTES_IDENTIFICACAO a
inner join SEXO_IDENTIFICACAO b on b.id = a.sexo_id
group by
b.sexo
union
select
CONCAT('Situacao Final ', IFNULL(b.situacao_final_id, "ND")), count(*)
from
TURMAS_HAS_ESTUDANTES a
left join SITUACAO_FINAL b on b.id = a.situacao_final
group by
b.situacao_final_id
Practical example
http://sqlfiddle.com/#! 9/04353fe/10
Final Result
| Resultado | Total |
|-------------------------------|-------|
| Total Estudantes | 15 |
| Sexo Feminino | 6 |
| Sexo Masculino | 9 |
| Situacao Final ND | 10 |
| Situacao Final Reclassificado | 1 |
| Situacao Final Remanejado | 2 |
| Situacao Final Transferido | 2 |
Practical Example Filtering Class
http://sqlfiddle.com/#! 9/b625e5/3
Result Filtering Class
| Resultado | Total |
|-------------------------------|-------|
| Total Estudantes | 6 |
| Sexo Feminino | 2 |
| Sexo Masculino | 4 |
| Situacao Final ND | 2 |
| Situacao Final Reclassificado | 1 |
| Situacao Final Remanejado | 1 |
| Situacao Final Transferido | 2 |
Structure data
create table ESTUDANTES_IDENTIFICACAO (
id int not null,
nome varchar(50),
sexo_id int,
deficiancia varchar(50)
);
insert into ESTUDANTES_IDENTIFICACAO values (1, 'nome_1', 1, null);
insert into ESTUDANTES_IDENTIFICACAO values (2, 'nome_2', 1, null);
insert into ESTUDANTES_IDENTIFICACAO values (3, 'nome_3', 2, null);
insert into ESTUDANTES_IDENTIFICACAO values (4, 'nome_4', 1, null);
insert into ESTUDANTES_IDENTIFICACAO values (5, 'nome_5', 2, null);
insert into ESTUDANTES_IDENTIFICACAO values (6, 'nome_6', 1, null);
insert into ESTUDANTES_IDENTIFICACAO values (7, 'nome_7', 1, null);
insert into ESTUDANTES_IDENTIFICACAO values (8, 'nome_8', 2, null);
insert into ESTUDANTES_IDENTIFICACAO values (9, 'nome_9', 1, null);
insert into ESTUDANTES_IDENTIFICACAO values (10, 'nome_10', 2, null);
insert into ESTUDANTES_IDENTIFICACAO values (11, 'nome_11', 2, null);
insert into ESTUDANTES_IDENTIFICACAO values (12, 'nome_12', 1, null);
insert into ESTUDANTES_IDENTIFICACAO values (13, 'nome_13', 1, null);
insert into ESTUDANTES_IDENTIFICACAO values (14, 'nome_14', 2, null);
insert into ESTUDANTES_IDENTIFICACAO values (15, 'nome_15', 1, null);
create table SEXO_IDENTIFICACAO (
id int not null,
sexo varchar(50)
);
insert into SEXO_IDENTIFICACAO values (1, 'Masculino');
insert into SEXO_IDENTIFICACAO values (2, 'Feminino');
create table TURMAS_HAS_ESTUDANTES (
id int not null,
turma_id int,
estudante_id int,
situacao_final int
);
insert into TURMAS_HAS_ESTUDANTES values (1, 492, 1, null);
insert into TURMAS_HAS_ESTUDANTES values (2, 492, 2, 3);
insert into TURMAS_HAS_ESTUDANTES values (3, 492, 3, null);
insert into TURMAS_HAS_ESTUDANTES values (4, 492, 4, 5);
insert into TURMAS_HAS_ESTUDANTES values (5, 492, 5, 6);
insert into TURMAS_HAS_ESTUDANTES values (6, 492, 6, 5);
insert into TURMAS_HAS_ESTUDANTES values (7, 493, 7, null);
insert into TURMAS_HAS_ESTUDANTES values (8, 493, 8, null);
insert into TURMAS_HAS_ESTUDANTES values (9, 493, 9, 3);
insert into TURMAS_HAS_ESTUDANTES values (10, 493, 10, null);
insert into TURMAS_HAS_ESTUDANTES values (11, 493, 11, null);
insert into TURMAS_HAS_ESTUDANTES values (12, 493, 12, null);
insert into TURMAS_HAS_ESTUDANTES values (13, 494, 13, null);
insert into TURMAS_HAS_ESTUDANTES values (14, 494, 14, null);
insert into TURMAS_HAS_ESTUDANTES values (15, 494, 15, null);
create table SITUACAO_FINAL (
id int not null,
situacao_final_id varchar(50)
);
insert into SITUACAO_FINAL values (3, 'Remanejado');
insert into SITUACAO_FINAL values (5, 'Transferido');
insert into SITUACAO_FINAL values (6, 'Reclassificado');
create table TURMAS_IDENTIFICACAO (
id int not null,
turma_id int
);
insert into TURMAS_IDENTIFICACAO values (1, 492);
insert into TURMAS_IDENTIFICACAO values (2, 493);
insert into TURMAS_IDENTIFICACAO values (3, 494);
Updated (28/02/2018 21:30)
The author requested the separation of the data by final situation. Practical example placed here: http://sqlfiddle.com/#! 9/b625e5/45/0
I thought of almost every possibility :D
New SQL
-- Total geral
select
'Total Estudantes' as Resultado, count(*) as Total
from
ESTUDANTES_IDENTIFICACAO a
inner join TURMAS_HAS_ESTUDANTES b on b.estudante_id = a.id
where
b.turma_id = 492
union
-- Busca total por situação final
select
case
when b.situacao_final is null then 'Total Estudantes Sem Situação Final'
else 'Total Estudantes Com Situação Final'
end as Resultado, count(*) as Total
from
ESTUDANTES_IDENTIFICACAO a
inner join TURMAS_HAS_ESTUDANTES b on b.estudante_id = a.id
where
b.turma_id = 492
group by
case
when b.situacao_final is null then 'Total Estudantes Sem Situação Final'
else 'Total Estudantes Com Situação Final'
end
union
-- Busca por sexo
select
CONCAT('Sexo ', b.sexo), count(*)
from
ESTUDANTES_IDENTIFICACAO a
inner join SEXO_IDENTIFICACAO b on b.id = a.sexo_id
inner join TURMAS_HAS_ESTUDANTES c on c.estudante_id = a.id
where
c.turma_id = 492
group by
b.sexo
union
-- Busca total por situação final e sexo
select
case
when c.situacao_final is null then CONCAT('Sexo ', b.sexo,' sem Situação Final')
else CONCAT('Sexo ', b.sexo, ' com Situação Final')
end as Resultado, count(*) as Total
from
ESTUDANTES_IDENTIFICACAO a
inner join SEXO_IDENTIFICACAO b on b.id = a.sexo_id
inner join TURMAS_HAS_ESTUDANTES c on c.estudante_id = a.id
where
c.turma_id = 492
group by
case
when c.situacao_final is null then CONCAT('Sexo ', b.sexo,' sem Situação Final')
else CONCAT('Sexo ', b.sexo, ' com Situação Final')
end
union
-- Sexo e descricao da situação final
select
CONCAT('Sexo ', b.sexo, ' com situacao ', IFNULL(d.situacao_final_id, "ND")), count(*)
from
ESTUDANTES_IDENTIFICACAO a
inner join SEXO_IDENTIFICACAO b on b.id = a.sexo_id
inner join TURMAS_HAS_ESTUDANTES c on c.estudante_id = a.id
left join SITUACAO_FINAL d on d.id = c.situacao_final
where
c.turma_id = 492
group by
CONCAT('Sexo ', b.sexo, ' com situacao ', IFNULL(d.situacao_final_id, "ND"))
union
select
CONCAT('Situacao Final ', IFNULL(b.situacao_final_id, "ND")), count(*)
from
TURMAS_HAS_ESTUDANTES a
left join SITUACAO_FINAL b on b.id = a.situacao_final
where
a.turma_id = 492
group by
b.situacao_final_id
you won’t be able to do this with a single
select
simple. you need to compute different things that need agroup by
orwhere
and are still on different tables, so you will need multiple selects to bring the expected result– Ricardo Pontual
In your "Expected Result" would be the result of several queries, and not just one, are you sure that’s what you want? The most correct would be to make separate consultations, of sex, situation and total.
– KaduAmaral
I believe that this consultation requires unions, so it is inherently different consultations
– Jefferson Quesado
I need to return the result of all classes. Class ID = 492 is just a reference
– Luis Souza
@Luissouza made a practical example that will serve any situation that arises
– Tiedt Tech
There was an error in the table photo class_identification. Corrected
– Luis Souza