none
Ajuda com consulta (left join + case) RRS feed

  • Pergunta

  • Olá comunidade, estou tentando realizar uma consulta (virará uma procedure) com o seguinte cenário:

    Tenho uma base de uma empresa e nela possuo duas tabelas: uma com relação dos funcionários ativos e demitidos e uma com os demitidos que contém a informação de tipo de demissão (se voluntária ou involuntária)

    No select, preciso do periodo (dia), ativos, demitidos, demitidos_voluntario e demitidos_involuntarios

    Tentei o seguinte código:

    select	e.periodo, e.ativos, e.admitidos, e.demitidos,
    	
    	case
    		when d.iniciativa = 'Empregado' and e.periodo = d.dt_desligamento
    			then COUNT(d.iniciativa)
    					end as demitidos_vol,
    	case
    		when d.iniciativa = 'Empresa' and e.periodo = d.dt_desligamento
    			then  COUNT(d.iniciativa)
    				end as demitidos_inv
    		
    
    from tb_evolucao_estrutura_grupo e 
    	 left join tb_demitidos d on e.periodo = d.dt_desligamento
    	 
    	 group by e.periodo, e.ativos, e.admitidos, e.demitidos, d.iniciativa, d.dt_desligamento
    	 
    	 order by e.periodo

    Com este código consigo o desejado, porém ele me duplica a linha quando possuo tanto voluntários quanto involuntários no mesmo dia.

    Também gostaria que invés de null mostrasse 0 quando não possui desligamento voluntario/involuntario no dia.

    Alguém pode me ajudar?

    Grato desde já.

    terça-feira, 6 de novembro de 2018 15:48

Respostas

  • Boa tarde,

    Experimente dessa forma:

    select	
        e.periodo, 
        e.ativos, 
        e.admitidos, 
        e.demitidos,
        COUNT(case when d.iniciativa = 'Empregado' then 1 end) as demitidos_vol,
        COUNT(case when d.iniciativa = 'Empresa' then 1 end) as demitidos_inv
    from tb_evolucao_estrutura_grupo e 
    left join tb_demitidos d on e.periodo = d.dt_desligamento
    group by 
        e.periodo, 
        e.ativos, 
        e.admitidos, 
        e.demitidos
    order by 
        e.periodo

    Espero que ajude


    Assinatura: http://www.imoveisemexposicao.com.br


    • Editado gapimex terça-feira, 6 de novembro de 2018 16:17
    • Marcado como Resposta Diego Devesa quarta-feira, 14 de novembro de 2018 11:55
    terça-feira, 6 de novembro de 2018 16:16

Todas as Respostas

  • Boa tarde,

    Experimente dessa forma:

    select	
        e.periodo, 
        e.ativos, 
        e.admitidos, 
        e.demitidos,
        COUNT(case when d.iniciativa = 'Empregado' then 1 end) as demitidos_vol,
        COUNT(case when d.iniciativa = 'Empresa' then 1 end) as demitidos_inv
    from tb_evolucao_estrutura_grupo e 
    left join tb_demitidos d on e.periodo = d.dt_desligamento
    group by 
        e.periodo, 
        e.ativos, 
        e.admitidos, 
        e.demitidos
    order by 
        e.periodo

    Espero que ajude


    Assinatura: http://www.imoveisemexposicao.com.br


    • Editado gapimex terça-feira, 6 de novembro de 2018 16:17
    • Marcado como Resposta Diego Devesa quarta-feira, 14 de novembro de 2018 11:55
    terça-feira, 6 de novembro de 2018 16:16
  • Diego,

    Ao invés de utilizar Left Join, tente com o Inner! Além disso, aplique o comando Distinct para tentar evitar esta duplicidade, algo que nem sempre será possível evitar dependendo da relação e junção dos dados.

    Em relação ao Null que esta sendo apresentado, utilize a função IsNull na respectiva coloque e informe o valor que deseja ser apresentado.


    Pedro Antonio Galvão Junior [MVP | MCC | MSTC | MIE | Microsoft Evangelist | Microsoft Partner | Engenheiro de Softwares | Especialista em Banco de Dados | Professor Universitário | @JuniorGalvaoMVP | http://pedrogalvaojunior.wordpress.com]

    terça-feira, 6 de novembro de 2018 16:22
  • Olá comunidade, estou tentando realizar uma consulta (virará uma procedure) com o seguinte cenário:

    Tenho uma base de uma empresa e nela possuo duas tabelas: uma com relação dos funcionários ativos e demitidos e uma com os demitidos que contém a informação de tipo de demissão (se voluntária ou involuntária)

    No select, preciso do periodo (dia), ativos, demitidos, demitidos_voluntario e demitidos_involuntarios

    Tentei o seguinte código:

    select	e.periodo, e.ativos, e.admitidos, e.demitidos,
    	
    	case
    		when d.iniciativa = 'Empregado' and e.periodo = d.dt_desligamento
    			then COUNT(d.iniciativa)
    					end as demitidos_vol,
    	case
    		when d.iniciativa = 'Empresa' and e.periodo = d.dt_desligamento
    			then  COUNT(d.iniciativa)
    				end as demitidos_inv
    		
    
    from tb_evolucao_estrutura_grupo e 
    	 left join tb_demitidos d on e.periodo = d.dt_desligamento
    	 
    	 group by e.periodo, e.ativos, e.admitidos, e.demitidos, d.iniciativa, d.dt_desligamento
    	 
    	 order by e.periodo

    Com este código consigo o desejado, porém ele me duplica a linha quando possuo tanto voluntários quanto involuntários no mesmo dia.

    Também gostaria que invés de null mostrasse 0 quando não possui desligamento voluntario/involuntario no dia.

    Alguém pode me ajudar?

    Grato desde já.

    Resolveu meu problema, obrigado!

    quarta-feira, 14 de novembro de 2018 11:57