none
Evolução mensal RRS feed

  • Pergunta

  • Olá pessoal,

    Estou tentando montar uma query select de uma evolução mensal de funcionários ativos. Ex:

    Sendo que tenho que agrupar a quantidade de funcionário ativos em cada período de mês.

    SELECT 
    	C.CODPESSOA, 
    	P.NOME, 
    	C.DTINICIO, 
    	C.DTSAIDA 
    FROM VPCOMPL C
    JOIN PPESSOA P ON P.CODIGO = C.CODPESSOA


    quinta-feira, 15 de setembro de 2022 19:18

Respostas

  • Boa tarde,

    Fiz um teste com a query que sugeri anteriormente utilizando o script abaixo e me parece que o resultado está correto:

    declare @VPCOMPL table (DTINICIO date, DTSAIDA date);
    insert into @VPCOMPL values
    ('20220101', null),
    ('20220101', '20220331'),
    ('20220601', '20220725'),
    ('20221001', null);
    
    declare @DataIni date;
    declare @DataFim date;
    set @DataIni = '20220101';
    set @DataFim = '20221031';
    
    with CTE_Meses as
    (
        select
            @DataIni as Inicio,
            EOMONTH(@DataIni) as Fim,
            DATEADD(MONTH, 1, @DataIni) as Proximo
    
        union all
    
        select
            Proximo,
            EOMONTH(Proximo),
            DATEADD(MONTH, 1, Proximo)
        from CTE_Meses
        where
            EOMONTH(Proximo) <= @DataFim
    )
    
    select
        m.Inicio,
        m.Fim,
        (select count(1) from @VPCOMPL as c
         where 
             c.DTINICIO <= m.Fim and
             (c.DTSAIDA is null or c.DTSAIDA >= m.Inicio)) as Ativos
    from CTE_Meses as m

    Nos meses de março/2022 e abril/2022 o funcionário demitido em março/2022 é desconsiderado, e depois nos meses de agosto/2022 e setembro/2022 o funcionário demitido em julho/2022 é desconsiderado.

    Espero que ajude


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

    terça-feira, 20 de setembro de 2022 17:43

Todas as Respostas

  • Evandro,

    A evolução a qual você se refere seria a quantidade de funcionários por?

    Se for isso não seria o caso de contar todos os funcionários em conjunto com o agrupamento por mês?


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

    quinta-feira, 15 de setembro de 2022 23:14
  • Quantidade de funcionários por mês!

    Como eu conto todos os funcionários em conjunto com o agrupamento por mês?

    Teste:

    SELECT 
    	MONTH(MES.DTINICIO) MES,
    	YEAR(MES.DTINICIO) ANO,
    	COUNT(MES.CODPESSOA) TOTAL FROM (
    SELECT 
    	C.CODPESSOA, 
    	P.NOME, 
    	C.DTINICIO, 
    	C.DTSAIDA 
    FROM VPCOMPL C
    JOIN PPESSOA P ON P.CODIGO = C.CODPESSOA) MES
    WHERE YEAR(MES.DTINICIO) = YEAR(GETDATE())
    GROUP BY 
    	MONTH(MES.DTINICIO),
    	YEAR(MES.DTINICIO)

    Desta forma eu tenho apenas os funcionários que entraram no mês! Eu preciso do total geral menos os demitidos daquele mês e mais os admitidos naquele mês... 

    ex: em janeiro havia 18, em fevereiro teve um demissão e duas admissões totalizando 19....


    sexta-feira, 16 de setembro de 2022 11:06
  • Boa tarde,

    Segue uma sugestão para testes:

    declare @DataIni date;
    declare @DataFim date;
    set @DataIni = '20220101';
    set @DataFim = '20220831';
    
    with CTE_Meses as
    (
        select
            @DataIni as Inicio,
            EOMONTH(@DataIni) as Fim,
            DATEADD(MONTH, 1, @DataIni) as Proximo
    
        union all
    
        select
            Proximo,
            EOMONTH(Proximo),
            DATEADD(MONTH, 1, Proximo)
        from CTE_Meses
        where
            EOMONTH(Proximo) <= @DataFim
    )
    
    select
        m.Inicio,
        m.Fim,
        (select count(1) from VPCOMPL as c
         where 
             c.DTINICIO <= m.Fim and
             (c.DTSAIDA is null or c.DTSAIDA >= m.Inicio)) as Ativos
    from CTE_Meses as m
    


    Na query acima os funcionários são considerados ativos no mês da saída, mas pode ser feito um ajuste no filtro da subquery se for o caso de desconsidera-los.

    Espero que ajude


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


    • Editado gapimex sexta-feira, 16 de setembro de 2022 18:59
    sexta-feira, 16 de setembro de 2022 18:57
  • Bom dia,

    O resultado do select está vindo o acumulado de admitidos teria que desconsiderar os demitidos para cada mês, veja:

    Sendo que no mês atual há apenas 18 ativos seja:

    SELECT	 
    	C.DTINICIO,
    	C.DTSAIDA, 
    	C.CODPESSOA
    FROM VPCOMPL C
    JOIN PPESSOA P ON P.CODIGO = C.CODPESSOA
    WHERE C.MENORAPRENDIZ = '01'
    AND C.DTSAIDA IS NULL

    E total de registros na tabela é 77 :

    Acredito que deveria ter mais uma condicional para saber a quantidade de funcionários que estavam ativos em cada mês.


    terça-feira, 20 de setembro de 2022 12:04
  • Evandro,

    Neste caso, como você sabe que o funcionário esta ativo ou não? Basicamente seria pela data de saída, ou existe algum outro atributo que faça este controle?

    Pois podemos ter funcionários em férias no período.


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

    terça-feira, 20 de setembro de 2022 16:10
  • Junior, 

    Nesse caso séria pela data de saída, ex: funcionário admitido DTINICIO = 01/06/2022 e demitido DTSAIDA = 25/07/2022. Esse funcionário vai constar nos meses 6 e 7.. nos próximos não!

    terça-feira, 20 de setembro de 2022 16:22
  • Evandro,

    Então, acrescente justamente o Where dentro da CTE ou no Select que vai executar a CTE.....


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

    terça-feira, 20 de setembro de 2022 16:27
  • Boa tarde,

    Fiz um teste com a query que sugeri anteriormente utilizando o script abaixo e me parece que o resultado está correto:

    declare @VPCOMPL table (DTINICIO date, DTSAIDA date);
    insert into @VPCOMPL values
    ('20220101', null),
    ('20220101', '20220331'),
    ('20220601', '20220725'),
    ('20221001', null);
    
    declare @DataIni date;
    declare @DataFim date;
    set @DataIni = '20220101';
    set @DataFim = '20221031';
    
    with CTE_Meses as
    (
        select
            @DataIni as Inicio,
            EOMONTH(@DataIni) as Fim,
            DATEADD(MONTH, 1, @DataIni) as Proximo
    
        union all
    
        select
            Proximo,
            EOMONTH(Proximo),
            DATEADD(MONTH, 1, Proximo)
        from CTE_Meses
        where
            EOMONTH(Proximo) <= @DataFim
    )
    
    select
        m.Inicio,
        m.Fim,
        (select count(1) from @VPCOMPL as c
         where 
             c.DTINICIO <= m.Fim and
             (c.DTSAIDA is null or c.DTSAIDA >= m.Inicio)) as Ativos
    from CTE_Meses as m

    Nos meses de março/2022 e abril/2022 o funcionário demitido em março/2022 é desconsiderado, e depois nos meses de agosto/2022 e setembro/2022 o funcionário demitido em julho/2022 é desconsiderado.

    Espero que ajude


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

    terça-feira, 20 de setembro de 2022 17:43
  • Boa tarde,

    Era isso mesmo... 

    declare @DataIni date;
    declare @DataFim date;
    set @DataIni = '20180101';
    set @DataFim = '20221031';
    
    with CTE_Meses as
    (
        select
            @DataIni as Inicio,
            EOMONTH(@DataIni) as Fim,
            DATEADD(MONTH, 1, @DataIni) as Proximo
    
        union all
    
        select
            Proximo,
            EOMONTH(Proximo),
            DATEADD(MONTH, 1, Proximo)
        from CTE_Meses
        where
            EOMONTH(Proximo) <= @DataFim
    )
    
    select
        m.Inicio,
        m.Fim,
        (select count(1) from VPCOMPL as c
         where c.MENORAPRENDIZ = '01'
    	 and
             c.DTINICIO <= m.Fim and
             (c.DTSAIDA is null or c.DTSAIDA >= m.Inicio)) as Ativos
    from CTE_Meses as m

    Obrigadão pelo ajuda!

    terça-feira, 20 de setembro de 2022 19:56