For all employees, insert the rows for each month and divide the Sales amount over these months as per number of calendars days in the month. Create a column for Running Total which will reset if a new year comes (Emp D is an example here) Ignore the error due to decimal rounding.
📌 Challenge Details and Links
ExcelBI Power Query Challenge Number: 174
Challenge Difficulty: ⭐️⭐️⭐️⭐️⭐️
📥Download Sample File
📥Link to the solutions on LinkedIn
Solving the challenge of Monthly Sales Split Calendar Days with Power Query
Power Query solution 1 for Monthly Sales Split Calendar Days, proposed by Aditya Kumar Darak 🇮🇳:
let
Source = Excel.CurrentWorkbook(){[Name = "data"]}[Content],
Record = Table.AddColumn(
Source,
"R",
each [
S = Date.From([From Date]),
E = Date.From([To Date]),
TD = Number.From(E - S) + 1,
G = List.Generate(
() => [D = 1, C = Date.AddDays(S, - 1), RT = 0, Y = 0],
(x) => x[D] > 0,
(x) => [
O = Date.AddDays(x[C], 1),
C = List.Min({Date.EndOfMonth(O), E}),
D = Number.From(C - O) + 1,
Y = Date.Year(O),
MS = Number.Round([Sales] * D / TD, 2),
RT = MS + (if x[Y] = Y then x[RT] else 0)
],
(x) => [
Emp = [Emp],
From Date = x[O],
To Date = x[C],
Monthly Sales = x[MS],
Running Total = x[RT]
]
),
R = List.Skip(G)
][R]
),
Return = Table.FromRecords(List.Combine(Record[R]))
in
Return
Power Query solution 2 for Monthly Sales Split Calendar Days, proposed by Alejandro Simón 🇵🇦 🇪🇸:
let
Source = Excel.CurrentWorkbook(){[Name = "Table1"]}[Content],
Sales = Table.AddColumn(
Source,
"Sales per Day",
each [Sales] / (Number.From([To Date] - [From Date]) + 1)
),
Days = Table.ExpandListColumn(
Table.AddColumn(
Sales,
"Days",
each List.Transform({Number.From([From Date]) .. Number.From([To Date])}, Date.From)
),
"Days"
),
EoM = Table.AddColumn(Days, "EoM", each Date.EndOfMonth([Days])),
Years = Table.AddColumn(EoM, "Year", each Date.Year([Days])),
Group = Table.Group(
Years,
{"Emp", "Year", "EoM"},
{
{
"A",
each Table.FromRows(
{{[Days]{0}, List.Last([Days]), List.Sum([Sales per Day])}},
{"From Date", "To Date", "Monthly Sales"}
)
}
}
),
ExpandB = Table.ExpandTableColumn(Group, "A", Table.ColumnNames(Group[A]{0})),
GroupB = Table.Group(
ExpandB,
{"Emp", "Year"},
{
{
"A",
each
let
a = [Monthly Sales],
b = List.Transform({1 .. List.Count(a)}, each List.Sum(List.FirstN(a, _))),
c = Table.FromColumns(
List.Skip(Table.ToColumns(_), 3) & {b},
List.Skip(Table.ColumnNames(_), 3) & {"RT"}
)
in
c
}
}
),
Sol = Table.RemoveColumns(
Table.ExpandTableColumn(GroupB, "A", Table.ColumnNames(GroupB[A]{0})),
"Year"
)
in
Sol
Power Query solution 3 for Monthly Sales Split Calendar Days, proposed by Luan Rodrigues:
let
Fonte = Tabela1,
add = Table.AddColumn(Fonte, "Personalizar", each
let
n = (Number.From([To Date]-[From Date])+1),
a = [Sales] / n,
b = List.Dates(Date.From([From Date]),n,hashtag#duration(1,0,0,0)),
c = List.Zip({List.Transform(b,each Text.From(Date.Year(_))&"/"&Text.From(Date.Month(_))),b,List.Repeat({a},List.Count(b))}),
d = List.Distinct(List.Transform(c, (x)=> List.Select(c, each _{0} = x{0}))),
e = List.Transform(d, each List.Sum(List.Transform(_, (x)=> x{2}))),
f = Table.FromRows(List.Zip({e,List.RemoveFirstN(List.Accumulate(e,{0}, (s,c)=> s&{List.Last(s)+c}))}),{"Monthly Sales","Running Total"})
in
f ),
res = Table.ExpandTableColumn(add, "Personalizar", Table.ColumnNames(add[Personalizar]{0}) )
in
res
Power Query solution 4 for Monthly Sales Split Calendar Days, proposed by Eric Laforce:
let
Source = Excel.CurrentWorkbook(){[Name = "tData174"]}[Content],
ChgType = Table.TransformColumnTypes(Source, {{"From Date", type date}, {"To Date", type date}}),
Transform = Table.TransformRows(
ChgType,
each
let
E = [Emp],
DStart = [From Date],
DEnd = [To Date],
SalesPerDay = [Sales] / (Duration.Days(DEnd - DStart) + 1),
SDates = List.Generate(
() => DStart,
each _ <= DEnd,
each Date.AddDays(Date.EndOfMonth(_), 1)
),
NewRowsValues = List.Accumulate(
SDates,
[v = {}, rt = 0],
(s, c) =>
let
_ds = c,
_de = List.Min({Date.EndOfMonth(c), DEnd}),
_MSales = (Duration.Days(_de - _ds) + 1) * SalesPerDay,
_RT = s[rt] + _MSales
in
[
v = s[v] & {{E, _ds, _de, _MSales, _RT}},
rt = _RT * Number.From(Date.Month(_ds) <> 12)
]
)
in
NewRowsValues[v]
),
Result = Table.FromRows(
List.Combine(Transform),
{"Emp", "From Date", "To Date", "Monthly Sales", "Running Total"}
)
in
Result
Power Query solution 5 for Monthly Sales Split Calendar Days, proposed by 🇮🇷 Navid Esmaeilzadeh اسماعیل زاده:
let
S = Excel.CurrentWorkbook(){[Name="Table1"]}[Content],
A = Table.TransformColumnTypes(S,{{"From Date", type date}, {"To Date", type date}, {"Sales", Int64.Type}}),
B = Table.AddColumn(A, "DL", each List.Dates([From Date], Duration.TotalDays([To Date]-[From Date])+1, hashtag#duration(1, 0, 0, 0))),
C = Table.AddColumn(B, "SPD", each [Sales]/List.Count([DL])),
D = Table.ExpandListColumn(C, "DL"),
E = Table.AddColumn(D, "Month Name", each Date.MonthName([DL]), type text),
E1 = Table.AddColumn(E, "Year", each Date.Year([DL]), Int64.Type),
G = Table.Group(E1, {"Emp", "Month Name", "Year"}, {{"From", each List.Min([DL]), type date}, {"To", each List.Max([DL]), type date}, {"SPD", each List.Average([SPD]), type number}, {"DayNo", each Table.RowCount(_), Int64.Type}}),
H = Table.AddColumn(G, "MonthlySales", each [SPD] * [DayNo], type number),
I = Table.SelectColumns(H,{"Emp","Year", "From", "To", "MonthlySales"}),
J = Table.Group(I, {"Emp", "Year"}, {{"Tbl", each _, type table [Emp=text, Year=number, From=date, To=date, MonthlySales=number]}}),
Power Query solution 6 for Monthly Sales Split Calendar Days, proposed by 🇮🇷 Navid Esmaeilzadeh اسماعیل زاده:
let
F1 = Table.AddIndexColumn(X, "I", 1, 1, Int64.Type),
F2 = Table.TransformColumns(F1,{{"MonthlySales", each Number.Round(_, 2), type number}}),
F3 = Table.AddColumn(F2, "RunningSales", each List.Sum(List.FirstN(F2[MonthlySales],[I]))),
F4 = Table.SelectColumns(F3,{"Emp", "From", "To", "MonthlySales", "RunningSales"})
in
F4,
K = Table.AddColumn(J, "F", each F([Tbl])),
L = Table.SelectColumns(K,{"F"}),
M = Table.ExpandTableColumn(L, "F", {"Emp", "From", "To", "MonthlySales", "RunningSales"}, {"Emp", "From", "To", "MonthlySales", "RunningSales"})
in
M
Power Query solution 7 for Monthly Sales Split Calendar Days, proposed by Yaroslav Drohomyretskyi:
let
Source = Excel.CurrentWorkbook(){[Name="Table1"]}[Content],
Dates = Table.AddColumn(Table.TransformColumnTypes(Source, {{"From Date", type date}, {"To Date", type date}}), "Dates", each List.Dates([From Date], Duration.Days([To Date] - [From Date]) + 1, hashtag#duration(1,0,0,0))),
DailyS = Table.AddColumn(Dates, "DailySales", each [Sales] / List.Count([Dates])),
ExpandDates = Table.ExpandListColumn(DailyS, "Dates"),
EoM = Table.TransformColumns(Table.DuplicateColumn(ExpandDates, "Dates", "EOM"), {{"EOM", Date.EndOfMonth, type date}}),
Year = Table.AddColumn(EoM, "Year", each Date.Year([EOM])),
Group = Table.Group(Year, {"Emp", "EOM", "Year"}, {{"From Date", each List.Min([Dates]), type date}, {"To Date", each List.Max([Dates]), type date}, {"Monthly Sales", each List.Sum([DailySales]), type number}}),
GroupYear = Table.Group(Group, {"Emp", "Year"}, {{"RT", each let a = [Monthly Sales], b = List.Transform({1..List.Count(a)}, each List.Sum(List.FirstN(a,_))), c = Table.FromColumns(List.Skip(Table.ToColumns(_), 3)&{b}, List.Skip(Table.ColumnNames(_), 3)&{"RT"}) in c}})
in
Table.RemoveColumns(Table.ExpandTableColumn(GroupYear, "RT", Table.ColumnNames(GroupYear[RT]{0})), "Year")
Power Query solution 8 for Monthly Sales Split Calendar Days, proposed by Luke Jarych:
let
Source = Excel.CurrentWorkbook(){[Name="Table1"]}[Content],
ChangedType = Table.TransformColumnTypes(Source,{{"From Date", type date}, {"To Date", type date}}),
TotalDays = Table.AddColumn(ChangedType, "TotalNumberOfDays", each Number.Abs(Duration.Days([From Date] - [To Date])-1)),
AddedColumn = Table.AddColumn(TotalDays, "TableResult", each
let
StartDate = [From Date],
EndDate = [To Date],
TotalDays = [TotalNumberOfDays],
Sales = [Sales],
TableWithDates = Table.FromRecords(List.Generate(
() => [Emp = [Emp], DateFrom = [From Date], ToDate = Date.EndOfMonth(StartDate), DaysInMonth = Number.From(ToDate - DateFrom)+1,
MonthlySales = Number.Round(Number.From((DaysInMonth/TotalDays)) * [Sales],2), Total = MonthlySales, Year = Date.Year(ToDate)],
each [DateFrom] <= EndDate,
Power Query solution 9 for Monthly Sales Split Calendar Days, proposed by Luke Jarych:
ToDate = if Date.Month(DateFrom) = Date.Month(EndDate) then EndDate else Date.EndOfMonth(DateFrom),
DaysInMonth = Number.From(ToDate - DateFrom)+1,
MonthlySales = Number.Round(Number.From((DaysInMonth/TotalDays)) * Sales,2),
Year = Date.Year(ToDate),
Total = if Year <> [Year] then MonthlySales else MonthlySales + [Total]
],
each [
Emp = [Emp],
From Date = [DateFrom],
To Date = [ToDate],
Monthly Sales = [MonthlySales],
Year = [Year],
Running Total = [Total]
]))
in TableWithDates
),
TableOutput = Table.SelectColumns(AddedColumn,{"TableResult"}),
ExpandedTable = Table.ExpandTableColumn(TableOutput, "TableResult", {"Emp", "From Date", "To Date", "Monthly Sales", "Year", "Running Total"})
in
ExpandedTable
Power Query solution 10 for Monthly Sales Split Calendar Days, proposed by Glyn Willis:
let
Source = Excel.CurrentWorkbook(){[Name="Table1"]}[Content],
#"Changed Type" = Table.ToRecords(Table.TransformColumnTypes(Source,{{"Emp", type text}, {"From Date", type date}, {"To Date", type date}, {"Sales", Int64.Type}})),
Custom1 = Table.Combine(List.Transform(#"Changed Type", each let
a=Duration.Days([To Date]-[From Date])+1,
b=[Sales]/a,
c=List.Transform({Int64.From([From Date])..Int64.From([To Date])},Date.From),
emp=List.Repeat({[Emp]},a),
d=List.Transform(c,Date.MonthName),
e=List.Transform(c,Date.Year),
f=Table.FromColumns({emp,c,d,e},type table [Emp=text,Date=date,Month=text,Year=number]),
g=Table.Group(f,{"Year","Month"},{{"Emp", each [Emp]{0}},{"From", each List.Min([Date])},{"To", each List.Max([Date])}}),
h=Table.AddColumn(g,"Sales",(r)=>(Duration.Days(r[To]-r[From])+1)*b)
in h)),
Power Query solution 11 for Monthly Sales Split Calendar Days, proposed by Glyn Willis:
let b=List.Buffer({Custom1[Emp],Custom1[Year],Custom1[Sales]}), l=List.Generate(()=>
[i=0,rt=b{2}{i},y=b{1}{i},e=b{0}{i}], each [i][y] or e<>[e]) then b{2}{i} else [rt]+(b{2}{i}),y=b{1}{i},e=b{0}{i}], each [rt]) in Table.FromColumns(List.Skip(Table.ToColumns(Custom1),2)&{l}, type table [Emp=text,From=date,To=date,Sales=number,Running Total=number]),
#"Rounded Off" = Table.TransformColumns(Custom2,{{"Sales", each Number.Round(_, 2,RoundingMode.AwayFromZero), type number}, {"Running Total", each Number.Round(_, 2,RoundingMode.AwayFromZero), type number}})
in
#"Rounded Off"
Solving the challenge of Monthly Sales Split Calendar Days with Excel
Excel solution 1 for Monthly Sales Split Calendar Days, proposed by Julian Poeltl:
=VSTACK({"Emp"."From Date"."To Date"."Monthly Sales"."Running Total"},LET(T,A2:D5,E,CHOOSECOLS(T,1),F,CHOOSECOLS(T,2),To,CHOOSECOLS(T,3),S,CHOOSECOLS(T,4),DDiff,To-F,DD,MONTH(To)-MONTH(F)+1,DDD,IF(DD<0,DD+12,DD),RDDD,SCAN(0,DDD,LAMBDA(A,B,A+B)),TM,MAKEARRAY(MAX(RDDD),4,LAMBDA(A,B,IFS(B=1,XLOOKUP(A,RDDD,E,,1),AND(B=2,A=1),INDEX(F,1),AND(B=2,A=XLOOKUP(A,RDDD,RDDD,,-1)+1),XLOOKUP(A,RDDD,F,,1),AND(B=3,ISNUMBER(XLOOKUP(A,RDDD,0))),INDEX(To,XMATCH(A,RDDD,-1)),B=4,XLOOKUP(A,RDDD,S,,1)/(XLOOKUP(A,RDDD,DDiff,INDEX(DDiff,1),1)+1)))),Emp,TAKE(TM,,1),RD,SCAN(0,CHOOSECOLS(TM,2),LAMBDA(A,B,IFERROR(B,EOMONTH(A,0)+1))),RDD,MAP(CHOOSECOLS(TM,3),RD,LAMBDA(T,F,IFERROR(T,EOMONTH(F,0)))),MS,IFERROR(CHOOSECOLS(TM,4)*(RDD-RD+1),INDEX(S,1)/(INDEX(To,1)-INDEX(F,1)+1)*(EOMONTH(INDEX(F,1),0)-INDEX(F,1)+1)),TTM,HSTACK(Emp,RD,RDD,MS,SCAN(0,SEQUENCE(MAX(RDDD)),LAMBDA(A,B,IF(AND(YEAR(INDEX(RD,B))=YEAR(INDEX(RD,B-1)),INDEX(Emp,B)=INDEX(Emp,B-1)),A+INDEX(MS,B),INDEX(MS,B))))),TTM))
Excel solution 2 for Monthly Sales Split Calendar Days, proposed by Duy Tùng:
=REDUCE(F1:J1,D2:D5,LAMBDA(x,y,LET(a,@+A5:y,b,@+B5:y,c,@+C5:y,d,SEQUENCE(c-b+1,,b),e,MONTH(d),f,DROP(GROUPBY(HSTACK(XMATCH(e,e),e),d,HSTACK(MIN,MAX),,0),1,2),g,ROUND(y/(c-b+1)*(BYROW(f*{-1,1},SUM)+1),2),
k,YEAR(TAKE(f,,1)),h,SEQUENCE(ROWS(k)),VSTACK(x,IFNA(HSTACK(a,f,g,MMULT((k=TOROW(k))*(h>=TOROW(h)),g)),a)))))
Excel solution 3 for Monthly Sales Split Calendar Days, proposed by Sunny Baggu:
=REDUCE(
{"Emp", "From Date", "To Date", "Monthly Sales", "Running Total"},
SEQUENCE(ROWS(A2:A5)),
LAMBDA(x, y,
VSTACK(
x,
LET(
_c1, INDEX(A2:D5, y, 1),
_c2, INDEX(A2:D5, y, 2),
_c3, INDEX(A2:D5, y, 3),
_c4, INDEX(A2:D5, y, 4),
_m, SEQUENCE(DATEDIF(_c2, EOMONTH(_c3, 0), "m") + 1, , 0),
_d, EOMONTH(_c2, SEQUENCE(DATEDIF(_c2, EOMONTH(_c3, 0), "m") + 1, , 0)),
_ed, IF(_d < _c3, _d, _c3),
_sd, VSTACK(_c2, DROP(_ed + 1, -1)),
_nd, _ed - _sd + 1,
_s, _nd * _c4 / SUM(_nd),
_ts, SCAN(
0,
SEQUENCE(ROWS(_sd)),
LAMBDA(a, v, (MONTH(INDEX(_sd, v)) <> 1) * a + INDEX(_s, v))
),
IFNA(HSTACK(_c1, _sd, _ed, _s, _ts), _c1)
)
)
)
)
Excel solution 4 for Monthly Sales Split Calendar Days, proposed by Md. Zohurul Islam:
=LET(u,A2:A5,v,B2:B5,w,C2:C5,z,D2:D5,I,INDEX,s,SEQUENCE(ROWS(u)),
hdr,HSTACK(A1,B1,C1,"MOnthly Sales","Running Total"),
result,REDUCE(hdr,s,LAMBDA(x,y,LET(
a,I(u,y),b,I(v,y),c,I(w,y),d,I(z,y),
sq,SEQUENCE(c-b+1,,b),
em,UNIQUE(EOMONTH(sq,0)),
e,VSTACK(TAKE(sq,1),FILTER(sq,DAY(sq)=1)),
f,TAKE(sq,-1),
g,IF(TAKE(e,-1)=f,f,TAKE(sq,-1)),
hd,VSTACK(DROP(em,-1),g),
dt,HSTACK(e,hd),
n,BYROW(dt,LAMBDA(x,SUM(DAY(x)*{-1,1},1))),
amt,MAP(n,LAMBDA(x,ROUND(d*x/SUM(n),2))),
rnt,DROP(REDUCE("",UNIQUE(YEAR(TAKE(dt,,1))),LAMBDA(j,k,VSTACK(j,SCAN(0,FILTER(amt,YEAR(TAKE(dt,,1))=k),SUM)))),1),
ans,IFNA(HSTACK(a,dt,amt,rnt),a),
res,VSTACK(x,ans),res))),
result)
Excel solution 5 for Monthly Sales Split Calendar Days, proposed by Tolga Demirci, PMP, PMI-ACP, MOS-Expert:
=LET(t,"mm/dd/yyyy",l,TEXTSPLIT(TEXTJOIN(",",,MAP(A2:A5,B2:B5,C2:C5,LAMBDA(a,b,c,TEXTJOIN(",",,TOCOL(TEXTSPLIT(TEXTJOIN(",",,SEQUENCE((c-b+1),,b,1)&",&"&a),",")))))),,","),j,IF({"A","B","C","D"}=l,1,0),p,DATEVALUE(TEXT(FILTER(l,BYROW(j,LAMBDA(d,SUM(d)))=0),t)),r,FILTER(l,BYROW(j,LAMBDA(d,SUM(d)))=1),w,RIGHT(UNIQUE(r&TEXT(p,"mmm")),3),v,LEFT(UNIQUE(FILTER(l,BYROW(j,LAMBDA(d,SUM(d)))=1)&TEXT(DATEVALUE(TEXT(FILTER(l,BYROW(j,LAMBDA(d,SUM(d)))=0),t)),"mmm")),1),s,TEXT(p,"mmm"),y,MAP(w,v,LAMBDA(a,b,MAX(FILTER(p,((b=r)*(a=s))=1)))),x,MAP(w,v,LAMBDA(a,b,MIN(FILTER(p,((b=r)*(a=s))=1)))),q,DATEVALUE(TEXT(FILTER(l,BYROW(j,LAMBDA(d,SUM(d)))=0),t)),m,j,HSTACK(LEFT(UNIQUE(FILTER(l,BYROW(m,LAMBDA(d,SUM(d)))=1)&TEXT(DATEVALUE(TEXT(FILTER(l,BYROW(m,LAMBDA(d,SUM(d)))=0),t)),"mmm")),1),x,MAP(w,v,LAMBDA(a,b,MAX(FILTER(q,((b=r)*(a=TEXT(q,"mmm")))=1)))),MAP(v,LAMBDA(j,FILTER(D2:D5,A2:A5=j)))/MAP(v,LAMBDA(i,SUM(IF(i=r,1,0))))*(y-x+1),VALUE(TEXTSPLIT(TEXTJOIN(",",,BYCOL(VALUE(IFERROR(DROP(TRANSPOSE(TEXTSPLIT(TEXTJOIN(,,BYCOL(TOROW(UNIQUE(v)),LAMBDA(w,TEXTJOIN(",",,FILTER(MAP(v,LAMBDA(j,FILTER(D2:D5,A2:A5=j)))/MAP(v,LAMBDA(i,SUM(IF(i=r,1,0))))*(y-x+1),w=v))))&"/"),",","/")),,-1),0)),LAMBDA(r,TEXTJOIN(",",,UNIQUE(SCAN(0,r,LAMBDA(p,o,SUM(p,o)))))))),,","))))
Solving the challenge of Monthly Sales Split Calendar Days with Python
Python solution 1 for Monthly Sales Split Calendar Days, proposed by Luke Jarych:
Part 1: Import Data:
import pandas as pd
import xlwings as xw
import numpy as np
import datetime as dt
wb = xw.Book(r'C:UsersLukeDownloadsPQ_Challenge_174 (1).xlsx')
sh = wb.sheets['Sheet1']
table = sh.tables['Table1']
rng = sh.range(table.range.address)
df = rng.options(pd.DataFrame, header = True, index=False, numbers=int).value
Solving the challenge of Monthly Sales Split Calendar Days with Python in Excel
Python in Excel solution 1 for Monthly Sales Split Calendar Days, proposed by Alejandro Campos:
df_input = xl("A1:D5", headers=True)
def pad(df, date_col, freq='D'):
return df.assign(**{date_col: pd.to_datetime(df[date_col])})
.set_index(date_col).asfreq(freq).reset_index()
res = (
df_input.melt(id_vars=["Emp", "Sales"], var_name="date", value_name="value")
.sort_values(["Emp", "value"])
.groupby("Emp", group_keys=False)
.apply(lambda x: pad(x, "value"))
.ffill()
.assign(
days=lambda x: x.groupby("Emp")["value"].transform("count"),
daily_sales=lambda x: x["Sales"] / x["days"],
month=lambda x: x["value"].dt.to_period("M").dt.to_timestamp(),
year=lambda x: x["value"].dt.year,
)
.groupby(["Emp", "month", "year"], as_index=False)
.agg(Monthly_Sales=("daily_sales", "sum"), From_Date=("value", "min"), To_Date=("value", "max"))
.assign(Running_Total=lambda x: x.groupby(["Emp", "year"])["Monthly_Sales"].cumsum())
.round({"Monthly_Sales": 2, "Running_Total": 2})
)[["Emp", "From_Date", "To_Date", "Monthly_Sales", "Running_Total"]]
res
Solving the challenge of Monthly Sales Split Calendar Days with R
R solution 1 for Monthly Sales Split Calendar Days, proposed by Anil Kumar Goyal:
library(readxl)
library(janitor)
library(tidyverse)
df <- read_xlsx("PQ/PQ_Challenge_174.xlsx", range = cell_cols(LETTERS[1:4]))
df %>%
clean_names() %>%
pivot_longer(contains("date"), values_to = "dates", names_to = NULL) %>%
mutate(dates = as.Date(dates)) %>%
group_by(emp) %>%
mutate(from_date = floor_date(dates, "month")) %>%
complete(from_date = seq.Date(min(from_date), max(from_date), "month")) %>%
fill(sales) %>%
mutate(from_date = case_when(row_number() == 1 ~ dates,
TRUE ~ from_date),
to_date = case_when(row_number() == n() ~ dates,
TRUE ~ ceiling_date(from_date, "month") - days(1))) %>%
select(-dates) %>%
mutate(month_sales = sales * as.numeric(to_date - from_date + 1)/as.numeric(sum(to_date - from_date + 1))) %>%
ungroup() %>%
group_by(emp, Year = year(from_date)) %>%
mutate(running_sales = cumsum(month_sales)) %>%
ungroup() %>%
select(Emp = emp, `From Date` = from_date, `To Date` = to_date, `Monthly Sales` = month_sales, `Running Total` = running_sales)
&&
