Ir para conteúdo
  • 0

Soma a nivel de linhas em M


Filippo Cupolillo
Ir para solução Solucionado por Erick Oliveira ,

Pergunta

  • Alunos

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
  • Alunos
  • Solução

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(
                            "VdpbjtswDIXhvfS5wFjizV5L0f1vo0lNUvyBPvSAwuQkI/lzMvnz59e1fj7/9rWeX39/f6L+XDKiIa7n57Og416I3x9lY3r9XD6m8XM940ftn3WN6SeOGssQ9yduPtB3uq93+um8RzTEz6P8L1nThVida/F6O9c0O9c0O9c0O9fUEKvzeKD/01WL35IZHfHz/7fkYufFzhklOy92Xuy82Hmx82Lnxc77nd5ZcvdUTvw+Ix2LF2J33v18fUyr82bnzc6bnTc7b3aW3oR7xIX4fVzldMTunPHOzsLOws7CzsLOws7Czlo/6i2ZURD3ky+7srOy8xvlQuzOys7KzsrOys7KztabUEZUxHVnSWNnY2fri4yPaXU2djZ2NnY2djZ2dh66jIH4fUZ6Ynd2dvZ+vj5idXZ2dnZ2dnZ2dnaO3oR7xAdxe77swc7BzjkNxO4c7BzsHOwc7BzsfPO6cfcGHnFplrzZ+Wbnuy8yPqbV+Wbnm51vdr7Z+Wbn5ukt+fAMPn2s5MTuTAdrMWN3poObDm46uOngpoNy4dBVNMSyW+ig0MGapt1CB4UOCh0UOih0UOigpDhptzRAM64qSQeFDkpL93amg0IHhQ4KHRQ6KHRQNg5dxnUh1hkUOih0sKaB2J3poNBBoYNCB4UOiuAMyhFHTiy7hQ4KHazFabfQQaGDQgeFDgodFDoo2ptwj7gQy26hg0IHK6bdQgeFDgodFDoodFDooFgfuj2iI+5UUuig0MGaKmJ3poNCB4UOCh0UOigtzlvSewOP2GeQDgodlJbufZ3poNBBoYNCB4UOCh2U6E24RwzEslvooNDBimm30EGhg0IHhQ4KHRQ6KHdvQhnxQeySd2+VEbvz3XvDx7Q600Ghg0IHhQ4KHZRD2x5xI155Xyd0UOhgxbyvEzoodFDooNBBoYNCBzUBSqwrKmLZrXRQ6WAtZqzOSgeVDiodVDqodFBXb0IZ0RDLbqWDSgdrmnYrHVQ6qHRQ6aDSQaWDunHoKt6IV97XKR1UOlgx7+uUDiodVDqodFDpoNJBld6E+8SyO+OXYxmxOtNBPaSO2J3poNJBpYNKB5UO6nnHt08su7V5ekvSQaWDtTjtVjqodFDpoNJBpYNKB9V6E+4RF2LZrXRQ6WDFtFvpoNJBpYNKB5UOKh1U7024R3TEslvpoNLBmipid6aDSgeVDiodVDqoLc5b8rwBHHHl50hKB5UO1uL8HEnpoNJBpYNKB5UOKh3Um9eNm9eNBCjhU7KodLBiOqh0UOmg0kGlg0oHlQ7qIUZG3IjfY6Undmc6WIsjO9NBpYNKB5UOKh1UOmiHtj3iRiy7jQ4aHayYdhsdNDpodNDooNFBo4O2ehPuERVR8rdgdNDo4Ig+YnWmg0YHjQ4aHTQ6aEc6GdEQy26jg0YHa5p2Gx00Omh00Oig0UGjgyY4gxVvxLLb6KDRwYppt9FBo4NGB40OGh00Omjam3CfWHZnLLuNDhodrOmN2J3poNFBo4NGB40O2iFGRtyIdd0wOmh0sBbndcPooNFBo4NGB40OGh0056Frj2bsM0gHjQ6O6CNWZzpodNDooNFBo4MWPHQZHXHn34CMDhodHFMf0+pMB40OGh00Omh00Fqc94XN6Ihlt9FBo4O1OO02Omh00Oig0UGjg0YH7eGhy7gQd77DNTpodLCmD2J3poNGB40OGh00OuiHGBlxI9YZdDrodLAW5xl0Ouh00Omg00Gng04H/dC2R9yIZbfTQaeDFdNup4NOB50OOh10Ouh00Hcfuj1iIO5U0umg00FvvGbsznTQ6aDTQaeDTgddcOj8vAEcceW9qNNBp4O1OO9FnQ46HXQ66HTQ6aDTQU+AEuuKD2LZ7XTQ6WDFtNvpoNNBp4NOB50OOh106024T6zLSMay2+mg08Ga3ojdmQ46HXQ66HTQ6aA7D915Azjilfd1TgedDmZceV/ndNDpoNNBp4NOB50OevQm3CMa4lUl6aDTQW/a3s500Omg00Gng04HnQ763ZtQRnTEstvpoNPBMfUxrc500Omg00Gng04HvcV5X9iHl5Hz10Md04XYnc/fFn1MqzMddDrodNDpoNPBON+E2SMuxLI76GDQwZo+iNU56GDQwaCDQQeDDsb5JoyMKIgrP0cKOhh0sBbn50hBB4MOBh0MOhh0MOhgbFw3Kgpi2R10MOhgxbQ76GDQwaCDQQeDDgYdDOlDt0cMxLI76GDQwWi8ZuzOdDDoYNDBoINBB0Nx6OK8ARyx7A46GHSwFqfdQQeDDgYdDDoYdDDoYJxvwuwRH8QrP8sNOhh0sGJ+lht0MOhg0MGgg0EHgw5Ge/T+9s8XY0bsM0gHgw7W4jqDdDDoYNDBoINBB4MORvAMBs/g+dqMjulC7M7Rl00f0+pMB4MOBh0MOhh0MM43YfaIhlh2Bx0MOhhN29uZDgYdDDoYdDDo4Df+/Qc=",
                            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

Faça login para comentar

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



Entrar Agora
×
×
  • Criar Novo...