здравствуйте друзья! мне нужно поделить сумму продажи по дням (число должен быть целым а остаток вставить в последний день месяца ожидаемый результат во вложении можно остаток вставить в другой день например в начале, главное чтобы не было дробных чисел
С делением не получилось. Например, вместо 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])
приходилось решать аналогичную задачу... на базе кода Михаил Л, предложу свое решение:
Код
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 дня. или три дня. вот как то так.
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
Михаил Л, Neostt , Ваше решение работает хорошо спасибо большое! Alien Sphinx, спасибо большое, ваше решение не всегда дает правильное решение попробуйте с такими данными
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])