Ir para conteúdo
  • 0

Calcular funcionarios ativos na empresa


liviacardinali
Ir para solução Solucionado por Bruno Abdalla de Souza ,

Pergunta

  • Alunos

Pessoal,

Eu trabalho para uma rede de hoteis, e preciso calcular a quantidade de funcionarios ativos na empresa. Mas meu diretor quer filtrar e saber a quantidade de ativos naquele determinado mes/ano...

Detalhes:

  • Se desfiltrar o mes e tiver somente o ano, em 2023, eh para mostrar a quantidade de ativos hoje (facil, ok)
  • Se desfiltrar o mes e tiver somente o ano, anos anteriores a 2023, eh para mostrar a quantidade de ativos no ultimo dia do ano (ou seja, em dez/ano)

COLUNAS:

  • Hotel ID
  • Payroll Number -- ID do funcionario
  • Esta ativo? true ou false
  • Start Date
  • End Date

Vou adicionar um excel contendo os resultados que foram feitos manualmente, e a base de dados!

 

Dificuldades encontradas:
- As vezes as medidas batem para alguns meses, ai em outros meses fica um valor nada a ver.... 
- A medida 2 ta mostrando direitinho a quantidade, mas entre marco, abril e maio de 2022 ta dando valor errado..... 

Abaixo vou colocar as medidas que tentei fazer de diferentes jeitos, mas nao funcionaram e eu realmente nao sei pq... mas vai que ajuda.

Active Employees =
var vMin = CALCULATE( MIN(dDate[Date]), NEXTMONTH(dDate[Date]), USERELATIONSHIP(dDate[Date], fTNA[End Date]) )
var vMax = CALCULATE( MAX(fTNA[End Date]), USERELATIONSHIP(dDate[Date], fTNA[End Date]), ALL(dDate) )
var vMinStart = CALCULATE( MIN (fTNA[Start Date]), NEXTMONTH(dDate[Date]), USERELATIONSHIP(dDate[Date], fTNA[Start Date]))
var vMaxStart = CALCULATE( MAX (fTNA[Start Date]), USERELATIONSHIP(dDate[Date], fTNA[Start Date]), ALL(dDate))
var v2 = CALCULATE( MIN(fTNA[Start Date]),  ALL(dDate), USERELATIONSHIP(dDate[Date], fTNA[Start Date]))
var v3 = CALCULATE( MAX(fTNA[Start Date]), USERELATIONSHIP(dDate[Date], fTNA[Start Date]))
var vFirstDay = CALCULATE( MIN(dDate[Date]), ALL(dDate[Month Ab]))
var vLastDay = CALCULATE( MAX(dDate[Date]), ALL(dDate[Month Ab]))
return
 
IF(
    SELECTEDVALUE(dDate[Year]) = YEAR(TODAY()) && SELECTEDVALUE(dDate[Month]) = MONTH(TODAY()),
    CALCULATE(
        DISTINCTCOUNT(fTNA[Payroll Number]),
        fTNA[Is Active] = true()
    ),
IF(
    SELECTEDVALUE(dDate[Year]) = YEAR(TODAY()) && NOT ( ISFILTERED(dDate[Month Ab]) ),
    CALCULATE(
        DISTINCTCOUNT(fTNA[Payroll Number]),
        fTNA[Is Active] = true()
    ),
 
IF(
    NOT( ISFILTERED(dDate[Month Ab]) ) && SELECTEDVALUE(dDate[Year]) <> YEAR(TODAY()),
    CALCULATE(
        CALCULATE(
                    DISTINCTCOUNT(fTNA[Payroll Number]),
                    fTNA[Is Active] = false(),
                    DATESBETWEEN(
                        dDate[Date],
                        vMin,
                        vMax
                    ),
                    USERELATIONSHIP(dDate[Date], fTNA[End Date])
                ) -
            CALCULATE(
                DISTINCTCOUNT(fTNA[Payroll Number]),
                fTNA[Is Active] = false(),
                DATESBETWEEN(
                    dDate[Date],
                    vMinStart,
                    vMaxStart
                ),
                USERELATIONSHIP(dDate[Date], fTNA[Start Date])
            ) +
            CALCULATE(
                DISTINCTCOUNT(fTNA[Payroll Number]),
                fTNA[Is Active] = true(),
                DATESBETWEEN(
                    dDate[Date],
                    v2,
                    v3
                ),
            USERELATIONSHIP(dDate[Date], fTNA[Start Date])
            ) ,
            dDate[Month] = MAX(dDate[Month])
        )
   
    ,IF( AND(
        ISFILTERED(dDate[Year]), ISFILTERED(dDate[Month Ab])),
        CALCULATE(
                DISTINCTCOUNT(fTNA[Payroll Number]),
                fTNA[Is Active] = false(),
                DATESBETWEEN(
                    dDate[Date],
                    vMin,
                    vMax
                ),
                USERELATIONSHIP(dDate[Date], fTNA[End Date])
            ) -
        CALCULATE(
            DISTINCTCOUNT(fTNA[Payroll Number]),
            fTNA[Is Active] = false(),
            DATESBETWEEN(
                dDate[Date],
                vMinStart,
                vMaxStart
            ),
            USERELATIONSHIP(dDate[Date], fTNA[Start Date])
        ) +
        CALCULATE(
            DISTINCTCOUNT(fTNA[Payroll Number]),
            fTNA[Is Active] = true(),
            DATESBETWEEN(
                dDate[Date],
                v2,
                v3
            ),
        USERELATIONSHIP(dDate[Date], fTNA[Start Date])
        )
)
)))

 

ou

 

Active Employees v2 =
var vMin = MIN(fTNA[Start Date])
var vMax = CALCULATE(MAX(fTNA[Start Date]), USERELATIONSHIP(dDate[Date], fTNA[Start Date]))
var vMinEnd = MIN(fTNA[End Date])
var vMaxEndCALCULATE(MAX(fTNA[End Date]), USERELATIONSHIP(dDate[Date], fTNA[End Date]))
 
return
 
IF(
    SELECTEDVALUE(dDate[Year]) = YEAR(TODAY()) && SELECTEDVALUE(dDate[Month]) = MONTH(TODAY()),
    CALCULATE(
        DISTINCTCOUNT(fTNA[Payroll Number]),
        fTNA[Is Active] = true()
    ),
IF(
    SELECTEDVALUE(dDate[Year]) = YEAR(TODAY()) && ISBLANK(SELECTEDVALUE(dDate[Month])),
    CALCULATE(
    COUNT(fTNA[Payroll Number]),
    fTNA[Start Date] >= vMin &&
    fTNA[Start Date] <= TODAY()
) -
CALCULATE(
    COUNT(fTNA[Payroll Number]),
    fTNA[End Date] >= vMinEnd &&
    fTNA[End Date] < TODAY()
)
,
    CALCULATE(
        COUNT(fTNA[Payroll Number]),
        fTNA[Start Date] >= vMin &&
        fTNA[Start Date] <= vMax
    ) -
    CALCULATE(
        COUNT(fTNA[Payroll Number]),
        fTNA[End Date] >= vMinEnd &&
        fTNA[End Date] <= vMaxEnd
    )
))

 

Muito obrigada pela ajuda 🙂Employees.xlsx

 

Link para o comentário
Compartilhar em outros sites

8 respostass a esta questão

Posts Recomendados

  • 0
  • Alunos
  • Solução

@liviacardinali, tenta isso. 

Active employees vBruno = 
VAR vAnoMesSel = MAX(dDate[AnoMesNum])
VAR vMesSel = SELECTEDVALUE(dDate[Month])
VAR vDataSel = MAX(dDate[Date])
VAR vUnitId = VALUES(dUnit[Unit])
VAR vHoje = TODAY()
VAR vAnoMesAtual = VALUE(FORMAT(vHoje, "YYYYMM"))
VAR vResultado = 
    IF(
        vAnoMesAtual = vAnoMesSel,
        CALCULATE(
            DISTINCTCOUNT(fTNA[Payroll Number]),
            fTNA[Is Active] = TRUE()
        ),
        CALCULATE(
            DISTINCTCOUNT(fTNA[Payroll Number]),
            FILTER(
                fTNA,
                fTNA[Start Date] <= vDataSel &&
                fTNA[End Date] > vDataSel &&
                fTNA[Unit ID] IN vUnitId
            )
        )
    )
RETURN
    COALESCE(
        vResultado,
        0
    )

 

20230525_Employee.pbix

Link para o comentário
Compartilhar em outros sites

  • 0
  • Alunos

Explica um pouco a regra envolvida neste cálculo, se é contagem normal ou distinta e como proceder variando os filtros de ano e mês. Por exemplo, como realizar o cálculo de funcionários ativos nas seguintes situações:

1) Se filtrar ano atual e mês atual

2) Se filtrar ano atual e mês que não seja o atual

3) Se filtrar ano atual sem filtrar mês algum

4) Se filtrar qualquer ano que não seja o atual e filtrar um mês qualquer

5) Se filtrar qualquer ano que não seja o atual e não filtrar mês algum

6) Se não filtrar nenhum ano e filtrar qualquer mês

7) Se não filtrar nenhum ano e nenhum mês

 

  • Like 1
Link para o comentário
Compartilhar em outros sites

  • 0
  • Alunos

A contagem na verdade acredito que tanto faz se é distinta ou normal, pq nao tem repeticao... Eu ate me confundi em uma das partes e coloquei COUNT(), mas geralmente eu faco DISTINCTCOUNT, por via das duvidas..

1) Se filtrar ano atual e mes atual: sera a contagem do payroll number em que o "Is Active" eh true. Ou seja, a contagem dos ativos hoje.

2) Se filtrar o ano atual e o mes que nao seja o atual: sera  a contagem de ativos naquele mes, com base nas colunas start date e end date, ou seja, se o funcionario comecou DEPOIS do mes filtrado, ele nao deve ser considerado. Se ele nao esta mais ativo na empresa hoje, mas no mes filtrado ele estava, ele estara no "Is Active" como false, mas devera ser considerado na conta. 

3) Se filtrar ano atual sem filtrar mês algum: mesmo resultado do 1). Sera a contagem de ativos hoje.

4) Se filtrar qualquer ano que não seja o atual e filtrar um mês qualquer: mesma regra do 2). Sera a contagem de funcionarios ativos naquele determinado mes e ano, com base nas colunas start date e end date.

5) Se filtrar qualquer ano que não seja o atual e não filtrar mês algum: Devera pegar a quantidade de funcionarios ativos no ultimo dia daquele ano. Entao se filtrar 2022 por ex, pegara os ativos do dia 31/12/2022

6) Se não filtrar nenhum ano e filtrar qualquer mês: -- Nao tem como nao selecionar o ano. O ano é um filtro obrigatorio no relatorio, mas em teoria, deveria pegar talvez a contagem distinta dos funcionarios ativos de todos os anos desse mes filtrado, ou uma media. 

7) Se não filtrar nenhum ano e nenhum mês: -- Tb nao tem essa opcao, mas nesse caso acho que deveria talvez pegar uma media dos ativos no periodo todo...

 

Eh minha primeira vez trabalhando com base de funcionarios e confesso que estou um pouco perdida com a visualizacao/estrutura.

Muito obrigada mesmo pela ajuda. Logica ainda eh uma coisa que estou trabalhando para melhorar rsrsr 

Link para o comentário
Compartilhar em outros sites

  • 0
  • Alunos

Muito obrigado pelas explicações.

Só mais uma dúvida. Para uma pessoa ser considerada inativa, data de end date deve ser menor que o início daquele período considerado?

Ex: estou analisando outubro de 2022. Então o Emd Date dele têm que ser menor que 01/10/2022, correto?

Outra coisa, para meu entendimento,.uma data de end date vazia significa que a pessoa ainda está ativa até a data mais recente do relatório?

Link para o comentário
Compartilhar em outros sites

  • 0
  • Alunos

Oi Bruno,

Se esta analisando outubro de 2022, o end date dele tem que ser maior do que 31/10/2022, pq se ele saiu depois, ele estava ativo nesse mes ainda

Se o end date esta vazio, a pessoa continua presente. POREM, tem excecoes. Algumas pessoas tem contrato, entao o end date dela ta pra por ex 31/10/2023. Ela esta ativa e essa eh a data do final do contrato....

Link para o comentário
Compartilhar em outros sites

  • 0
  • Alunos
Em 26/05/2023 em 17:31, Bruno Abdalla de Souza disse:

@liviacardinali, tenta isso. 

Active employees vBruno = 
VAR vAnoMesSel = MAX(dDate[AnoMesNum])
VAR vMesSel = SELECTEDVALUE(dDate[Month])
VAR vDataSel = MAX(dDate[Date])
VAR vUnitId = VALUES(dUnit[Unit])
VAR vHoje = TODAY()
VAR vAnoMesAtual = VALUE(FORMAT(vHoje, "YYYYMM"))
VAR vResultado = 
    IF(
        vAnoMesAtual = vAnoMesSel,
        CALCULATE(
            DISTINCTCOUNT(fTNA[Payroll Number]),
            fTNA[Is Active] = TRUE()
        ),
        CALCULATE(
            DISTINCTCOUNT(fTNA[Payroll Number]),
            FILTER(
                fTNA,
                fTNA[Start Date] <= vDataSel &&
                fTNA[End Date] > vDataSel &&
                fTNA[Unit ID] IN vUnitId
            )
        )
    )
RETURN
    COALESCE(
        vResultado,
        0
    )

 

20230525_Employee.pbix 107.1 kB · 0 downloads

Obrigada, Bruno! 🙂

Link para o comentário
Compartilhar em outros sites

Faça login para comentar

Você vai ser capaz de deixar um comentário após fazer o login



Entrar Agora
×
×
  • Criar Novo...