Ir para conteúdo

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

bruno.291193

SELECT COUNT dentro de outro SELECT

Recommended Posts

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
FROM RODCAM_HIS INNER JOIN RODMOT ON RODCAM_HIS.CODMOT = RODMOT.CODMOT
WHERE RODCAM_HIS.CODMTV = 94 (Faltas justificadas)
GROUP BY RODCAM_HIS.CODMOT
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.

Compartilhar este post


Link para o post
Compartilhar em outros sites

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

Compartilhar este post


Link para o post
Compartilhar em outros sites

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.

Compartilhar este post


Link para o post
Compartilhar em outros sites

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 = (select 
count(RODCAM_HIS.CODMTV) 
from
     RODCAM_HIS 
     inner join RODMOT 
          on RODCAM_HIS.CODMOT = RODMOT.CODMOT 
where 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;
end$$

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

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.