Страницы: 1
RSS
деление продаж по дням помощью PQ
 
здравствуйте друзья!
мне нужно поделить сумму продажи по дням  (число должен быть целым а остаток вставить в последний день месяца
ожидаемый результат во вложении
можно остаток вставить в другой день например в начале, главное чтобы не было дробных чисел
Изменено: azma - 12.04.2023 11:36:09
 
С делением не получилось. Например,  вместо 11 поставить 99, а вместо 12 поставить 13
Код
let
    Source = Table.PromoteHeaders( Excel.CurrentWorkbook(){[Name="tbl"]}[Content])
    in Table.Combine( Table.AddColumn(Source, "a", each let   a =  Date.EndOfMonth([Date Start]),
    b = Number.IntegerDivide(Number.From(a - [Date Start]),1),
    c = Number.RoundDown([Продажи]/b),
    d = [Продажи] - c * b,
    e = List.Dates(Date.From([Date Start]), b+1, #duration(1, 0, 0, 0)),
    f = List.Repeat({c},b)&{d}
in Table.FromColumns({e,f},{"Date","Продажи"}))[a])
Изменено: Михаил Л - 12.04.2023 15:51:52
 
приходилось решать аналогичную задачу... на базе кода Михаил Л,  предложу свое решение:
Код
let
    Source = Table.PromoteHeaders( Excel.CurrentWorkbook(){[Name="tbl"]}[Content])
    in Table.Combine( Table.AddColumn(Source, "a", each let   a =  Date.EndOfMonth([Date Start]),
    b = Number.IntegerDivide(Number.From(a - [Date Start]),1)+1,
    c_min = Number.RoundDown([Продажи]/b),
    c_maх = Number.RoundUp([Продажи]/b),
    k_maх=[Продажи]-b*c_min,
    k_min=b-k_maх,
    e = List.Dates(Date.From([Date Start]), b, #duration(1, 0, 0, 0)),
    f = List.Repeat({c_maх},k_maх)&List.Repeat({c_min},k_min)
in Table.FromColumns({e,f},{"Date","Продажи"}))[a])
 
каким должен быть результат при продажах: 17, 53, 21  ?
Код
let
    #"tbl (2)" = let
    Source = Table.PromoteHeaders( Excel.CurrentWorkbook(){[Name="tbl"]}[Content])
    in Table.Combine( Table.AddColumn(Source, "a", each 
    let   a =  Date.EndOfMonth([Date Start]),
    b = Number.IntegerDivide(Number.From(a - [Date Start]),1)+1,
    c = if  [Продажи] - Number.RoundUp ( [Продажи]/b)  * (b-1)<0 
    then Number.RoundDown ( [Продажи]/b) else Number.RoundUp ( [Продажи]/b),   
    d = [Продажи] - c * (b-1),
    e = List.Dates(Date.From([Date Start]), b, #duration(1, 0, 0, 0)),
    f = List.Repeat({c},b-1)&{d}
in  Table.FromColumns({e,f},{"Date","Продажи"}))[a]),
    #"Changed Type" = Table.TransformColumnTypes(#"tbl (2)",{{"Date", type date}})
in
    #"Changed Type"
 
спасибо большое я завтра посмотрю.
для меня важно как можно решить такую задачу, а так цифры я придумал да и задачи.
а завтра проверю на разные цифры.

я хотел  чтобы поучаствовали  все, чтобы получить разные решение.
ещё раз спасибо!
 
Цитата
написал:
каким должен быть результат при продажах: 17, 53, 21  ?
важно чтобы максимально  был продажи по днем одинаково, и без дробных можно  конечно остаток деление вставить в одну дату но  можно и остаток поделить на 2 дня. или три дня. вот как то так.  
 
Коллеги, List.Generate в помощь :)
Сегодня нет времени, завтра постараюсь выложить расчет.
 
Код
let
    Source = Excel.CurrentWorkbook(){[Name="Table1"]}[Content],
    rec = List.Buffer(Table.ToRecords(Table.TransformColumnTypes(Source,{{"Date Start", type date}, {"Продажи", Int64.Type}}))),
    функшн = (r as record) =>
        let 
            days = Duration.Days(Date.EndOfMonth(r[Date Start]) - r[Date Start]) + 1,
            days_list = List.Dates(r[Date Start], days, #duration(1, 0, 0, 0)),
            values = 
                [a = Number.Mod(r[Продажи], days),
                b = Number.Round(r[Продажи] / days),
                w = Number.RoundDown(r[Продажи] / (days - 1)),
                c = 
                    if a = 0 
                    then List.Repeat({b}, days) 
                    else 
                        [m = days - 1, 
                        n = List.Repeat({w}, m) & {Number.Mod(r[Продажи], m)}
                        ][n]
                ][c],
                t = Table.FromColumns({days_list, values}, {"Date", "Продажи"})           
        in t,
    z = Table.Combine(List.Transform(rec, функшн))
in
    z
Изменено: Alien Sphinx - 13.04.2023 11:39:45 (bugs)
Пришелец-прораб.
 
Михаил Л, Neostt , Ваше решение работает хорошо спасибо большое!
Alien Sphinx, спасибо большое, ваше решение не всегда дает правильное решение
попробуйте с такими данными
 
Date StartПродажи
20.01.202318
25.02.202311
20.03.202312
 
Цитата
написал:
List.Generate в помощь
с нетерпением жду Вас!
 
коллеги, пожалуйста, предложите тоже вариант с исключением из список выходных дней
если Вам не сложно.
 
Цитата
azma написал:
вариант с исключением из список выходных дней
Код
let
    Source = Table.PromoteHeaders( Excel.CurrentWorkbook(){[Name="tbl"]}[Content])
    in Table.Combine(Table.AddColumn(Source, "a", each 
    let   a =  Date.EndOfMonth([Date Start]),
    b = Number.IntegerDivide(Number.From(a - [Date Start]),1)+1,
    e = List.Select(List.Dates(Date.From([Date Start]), b, #duration(1, 0, 0, 0)), each Date.DayOfWeek(_)<5),
    b3= List.Count( e ),
    c = if  [Продажи] - Number.RoundUp ( [Продажи]/b3)  * (b3-1)<0 
    then Number.RoundDown ( [Продажи]/b3) else Number.RoundUp ( [Продажи]/b3),   
    d = [Продажи] - c * (b3-1),
    f = List.Repeat({c},b3-1)&{d}
in  Table.FromColumns({e,f},{"Date","Продажи"}))[a])
 
Цитата
написал:
Михаил Л
спасибо большое!!!
 
Цитата
surkenny написал:
List.Generate в помощь
Что-то я погорячился. Тут List.Generate не нужна. Вот если бы каждый день разный вес имел...
По сути эквивалентно решению #3:
Код
let
  data = Excel.CurrentWorkbook(){[ Name = "tbl" ]}[Content],
  typed = Table.TransformColumnTypes ( data, { { "Date Start", type date }, { "Продажи", type number } } ),
  transform = Table.TransformRows (
    typed,
    ( r ) =>
      [
        s      = r[Продажи],
        sd     = r[Date Start],
        ed     = Date.EndOfMonth ( sd ),
        dur    = Duration.TotalDays ( ed - sd ) + 1,
        cnt    = Number.IntegerDivide ( s, dur ),
        add    = Number.Mod ( s, dur ),
        dates  = List.Dates ( sd, dur, #duration ( 1, 0, 0, 0 ) ),
        sales  = List.Repeat ( { cnt + 1 }, add ) & List.Repeat ( { cnt }, dur - add ),
        result = Table.FromColumns ( { dates, sales }, type table [ Date Start = date, Продажи = number ] )
      ][result]
  ),
  combine = Table.Combine ( transform )
in
  combine
 
Цитата
написал:
По сути эквивалентно решению #3:
спасибо большое Вам
Страницы: 1
Наверх