Usamos cookies para medir audiência e melhorar sua experiência. Você pode aceitar ou recusar a qualquer momento. Veja sobre o iMasters.
Bom dia,
Estou com dificuldade em fazer um select count (na verdade são 2) dentro de outro select:
Preciso listar todos os funcionários com os devidos campos, e os dois últimos campos são: contador de faltas justificadas (código 94) e outro campo contando faltas não justificadas (código 95).
O select dos primeiros campos da listagem é:
SELECT MO.CODMOT, MO.NOMMOT, MO.CODFOL, CL.DESCRI CLASSIFICACAO, CC.DESCRI CENTRO_CUSTO
FROM RODMOT MO INNER JOIN RODCUS CC ON MO.CODCUS=CC.CODCUS
INNER JOIN RODCMO CL ON MO.CODCMO=CL.CODCMO
WHERE MO.CODMOT='626' (Exemplo de motorista).
O select que conta as faltas (da tabela RODCAM_HIS=Histórico de advertência) é:
SELECT RODCAM_HIS.CODMOT, COUNT(RODCAM_HIS.CODMTV) AS MOTIVO Esse segundo select me retorna os motoristas que tenham faltas justificadas, e no segundo campo quantas faltas eles tem. Porém ele não me traz todos os funcionários, apenas os que tem essa falta, eu gostaria de estar exibindo todos, independentemente de existir esse registro. Tentei trocar o INNER JOIN por LEFT, RIGHT, FULL, OUTER's e não obtive nenhuma alteração no SLEECT.
O segundo problema é que não estou conseguindo inserir o segundo SELECT dentro do primeiro, para listar TODOS os motoristas, tendo faltas ou não, e os dois últimos campos sendo "FALTAS JUSTIFICADAS" e "FALTAS NÃO JUSTIFICADAS".
Muito obrigado.
Bom dia Fabiano, primeiramente gostaria de agradecer pela ajuda.
Desculpe, mas não estou muito familiarizado com functions em SQL, será que isso resolveria meu problema? Eu preciso, especificamente, exibir os primeiros campos e mais os dois de contagem, no mesmo result e ao mesmo tempo.
Será que isso é possível?
Muito obrigado.
Bruno, funcionará sim.
Criei um exemplo para lhe ajudar:
delimiter $$
drop function if exists fun_busca_qtd_faltas$$
create function fun_busca_qtd_faltas(
p_cod_mot int,
p_justificada char(1)
) returns int deterministic
begin
declare qtd_faltas int;
set qtd_faltas = (selectwhere RODCAM_HIS.CODMTV = if(p_justificada = 'S',94,CODIGO PARA INJUSTIFICADA)
and RODCAM_HIS.CODMOT = p_cod_mot
group by RODCAM_HIS.CODMOT);
return qtd_faltas;delimiter ;
Obs: não testei.
Da forma acima você poderá fazer:
select
MO.CODMOT
, MO.NOMMOT
, fun_busca_qtd_faltas(MO.CODMOT,'S') as Faltas_Justificadas
, fun_busca_qtd_faltas(MO.CODMOT,'N') as Faltas_Injustificadas
, MO.CODFOL
, CL.DESCRI CLASSIFICACAO
, CC.DESCRI CENTRO_CUSTO
from
RODMOT MO
inner join RODCUS CC
on MO.CODCUS = CC.CODCUS
inner join RODCMO CL
on MO.CODCMO = CL.CODCMO
where MO.CODMOT = '626';
Veja se desta forma irá lhe atender.
Abraços.
_ _
Fabiano Abreu
Papo SQL - De tudo um pouco sobre SQL
Fabiano,
Consegui resolver, muito obrigado pela ajuda e consideração.
Até uma próxima. =)
Bruno, boa tarde.
Buscando praticidade, faça o seguinte, crie uma função que ao momento que você passar o id do funcionário ele retorne as faltas, você pode fazer uma função, que você passe o id e se quer as faltas justificável ou não, ai você trata isso dentro da função.
Ou você pode criar duas funções, uma para justificável e outra para injustificável, ai você passa a função no primeiro select, se o funcionário tiver faltas, a função irá retornar, caso não...
Espero ter sido útil, abraços.
_ _
Fabiano Abreu
Papo SQL - De tudo um pouco sobre SQL