Ir para conteúdo
  • 0

Soma a nivel de linhas em M


Filippo Cupolillo

Pergunta

  • Membros

O problema é o seguinte: preciso montar no POWER QUERY uma lógica que resulte em 2 colunas:
1 - DU ACUMULADO DO MÊS
2 - COMPARATIVO ENTRE O DU MAIS ATUAL QUE EU TENHO (ex.: hoje é o DU11 de maio, para todas as linhas dos outros meses, os DUS 1 a 11 serão flg = 1 e os DUS 12 para frente serão 0

eu fiz isso em DAX:
image.jpeg.46b1fdad91cb063003465a835a36d009.jpeg

 

coluna DU:
faço usando uma tabela de feriados: se a data é feriado/sábado/domingo, DU = 0  se data é dia da semana (sem feriado) DU = 1

Coluna DU_Passo1: (codigo dax logo na sequencia)
deve somar o DU_Passo1 do dia anterior + o DU da linha do dia atual, ex: dia 16/04/2023 tem DU_passo1 = 9 e dia 17/04/2023 tem DU = 1, então o DU_PASSO1 do dia 17/04/2023 é 9+1 = 10.

Coluna DU_MTD (codigo dax logo na sequencia)
esse vai comparar os DU_PASSO1 com o DU do dia de ontem (ex.: ontem 16/05, é o DU11 de maio, então compara todos os DUs de abril para trás comparando se é igual ou maior do que 11)
No exemplo da foto, o dia 18/04 é o DU_ACUMULADO = 11. Todos os dias ANTES tem o DU MTD = TRUE e os dias DEPOIS de 18/04 terão o DU_MTD = false
 

DU_passo1 = 
VAR atual = 'dCalendário'[Data]
VAR anomes = 'dCalendário'[Ano Mês]

RETURN
CALCULATE (
    SUM ( 'dCalendário'[DU] ),
    FILTER (
        'dCalendário',
        'dCalendário'[Data] <= atual
        && 'dCalendário'[Ano Mês] = anomes
        )
    )

DU MTD = VAR du_acumulado_atual =
    LOOKUPVALUE (
        'dCalendário'[DU_passo1],
        'dCalendário'[Data],
            TODAY () - 1
    )
RETURN
    'dCalendário'[DU_passo1] <= du_acumulado_atual

Gostaria de usar a mesma logica feita em DAX porém em M, podem me ajudar?

Link para o comentário
Compartilhar em outros sites

1 resposta a esta questão

Posts Recomendados

  • 0
  • Membros

Boa noite, @Filippo Cupolillo;

 

Segue em solução em M:

 

let
    MenorData = #date(2023, 1, 1),
    MaiorData = #date(2023, 12, 31),
    MenorAno = Date.Year(MenorData),
    MaiorAno = Date.Year(MaiorData),
    DataInicio = #date(MenorAno, 1, 1),
    DataFim = #date(MaiorAno, 12, 31),
    Dias = Duration.Days(DataFim - DataInicio) + 1,
    ListarDatas = List.Dates(DataInicio, Dias, #duration(1, 0, 0, 0)),
    Tabela = #table(
        type table [
            Data = date,
            AnoMesInt = Int64.Type,
            DiaSemana = Int64.Type,
            DiaSemanaNome = text
        ],
        List.Transform(
            ListarDatas,
            each
                {
                    _,
                    Date.Year(_) * 100 + Date.Month(_),
                    Date.DayOfWeek(_),
                    Date.DayOfWeekName(_)
                }
        )
    ),
    Feriados =
        let
            Fonte = Table.FromRows(
                Json.Document(
                    Binary.Decompress(
                        Binary.FromText(
                            "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",
                            BinaryEncoding.Base64
                        ),
                        Compression.Deflate
                    )
                ),
                let
                    _t = ((type nullable text) meta [Serialized.Text = true])
                in
                    type table [Data = _t]
            ),
            #"Tipo Alterado" = Table.TransformColumnTypes(Fonte, {{"Data", type date}})
        in
            #"Tipo Alterado",
    #"Consultas Mescladas" = Table.NestedJoin(Tabela, {"Data"}, Feriados, {"Data"}, "dFeriados", JoinKind.LeftOuter),
    #"dFeriados Expandido" = Table.ExpandTableColumn(#"Consultas Mescladas", "dFeriados", {"Data"}, {"Feriado"}),
    #"Dias Utéis" = Table.AddColumn(
        #"dFeriados Expandido",
        "DiaUtil",
        each if [DiaSemana] = 6 or [DiaSemana] = 0 or [Feriado] <> null then 0 else 1,
        Int64.Type
    ),
    #"Adicionar DU" = Table.AddColumn(
        #"Dias Utéis", "DU", each if [DiaUtil] = 1 then 0 else if [DiaSemana] = 0 or [DiaSemana] = 6 then 0 else 1,
        Int64.Type
    ),
    #"Linhas Classificadas" = Table.Sort(#"Adicionar DU", {{"Data", Order.Ascending}}),
    ListaMeses = List.Buffer(#"Linhas Classificadas"[AnoMesInt]),
    ListaDU = List.Buffer(#"Linhas Classificadas"[DU]),
    SomarAcumulada =
        let
            ListaAcumulada = List.Generate(
                () => [
                    X = ListaDU{0},
                    i = 0
                ],
                each [i] < List.Count(ListaDU),
                each
                    try
                        if ListaMeses{[i]} = ListaMeses{[i] + 1} then
                            [
                                X = [X] + ListaDU{[i] + 1},
                                i = [i] + 1
                            ]
                        else
                            [
                                X = ListaDU{[i] + 1},
                                i = [i] + 1
                            ]
                        otherwise [
                            i = [i] + 1
                        ],
                each [X]
            )
        in
            ListaAcumulada,
    Nomes = Table.ColumnNames(#"Linhas Classificadas"),
    ListaColunas = List.Transform(Nomes, each Table.Column(#"Linhas Classificadas", _)),
    DU_Passo1 = Table.FromColumns(
        List.Combine({ListaColunas, {SomarAcumulada}}), List.Combine({Nomes, {"DU_passo1"}})
    ),
    AcumuladoAtual = Table.SelectRows(DU_Passo1, each Date.IsInPreviousDay([Data]))[DU_passo1]{0},
    #"Adicionar DU MTD" = Table.AddColumn(DU_Passo1, "DU MTD", each [DU_passo1] <= AcumuladoAtual, type logical)
in
    #"Adicionar DU MTD"

 

Link para o comentário
Compartilhar em outros sites

Crie uma conta ou entre para comentar

Você precisar ser um membro para fazer um comentário

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!

Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.

Entrar Agora
×
×
  • Criar Novo...