Table 1 has salary for different names and Table 2 has percentage deduction applicable for various salary ranges. Hence if salary is 51000, then 40% deduction is applicable. Hence, person gets 51000 * (1-0.4) = 30600 Find the person who gets the highest salary after the deduction.
📌 Challenge Details and Links
ExcelBI Excel Challenge Number: 205
Challenge Difficulty: ⭐️
📥Download Sample File
📥Link to the solutions on LinkedIn
Solving the challenge of Top Net Salary Earner with Power Query
Power Query solution 1 for Top Net Salary Earner, proposed by Bo Rydobon 🇹🇭:
let
Source = Excel.CurrentWorkbook(){[Name = "Table1"]}[Content],
T2 = Table.Buffer(Excel.CurrentWorkbook(){[Name = "Table2"]}[Content]),
Ded = Table.AddColumn(
Source,
"D",
each [Salary] * (1 - List.Last(Table.SelectRows(T2, (t) => t[From] <= [Salary])[Deduction]))
),
Remove = Table.RemoveColumns(Table.SelectRows(Ded, each [D] = List.Max(Ded[D])), "D")
in
Remove
Power Query solution 2 for Top Net Salary Earner, proposed by Zoran Milokanović:
let
Source = Excel.CurrentWorkbook(){[Name = "Table1"]}[Content],
Table2 = Excel.CurrentWorkbook(){[Name = "Table2"]}[Content],
AddedDeduction = Table.AddColumn(
Source,
"Deduction",
each [Salary]
* (
1
- Table.SelectRows(
Table2,
(i) => [Salary] >= i[From] and (i[To] = "No Limit" or [Salary] <= i[To])
)[Deduction]{0}
)
),
Solution = Table.SelectRows(
AddedDeduction,
each [Deduction] = List.Max(AddedDeduction[Deduction])
)[[Names], [Salary]]
in
Solution
Power Query solution 3 for Top Net Salary Earner, proposed by Alejandro Simón 🇵🇦 🇪🇸:
let
Source = Excel.CurrentWorkbook(){[Name = "Table1"]}[Content],
Deduction = Excel.CurrentWorkbook(){[Name = "Table2"]}[Content],
Join = Table.AddColumn(
Source,
"Deduction",
(x) => Table.Last(Table.SelectRows(Deduction, each [From] <= x[Salary]))[Deduction]
),
Sol = Table.MaxN(Table.AddColumn(Join, "New", each [Salary] * (1 - [Deduction])), "New", 2)[
[Names],
[Salary]
]
in
Sol
Power Query solution 4 for Top Net Salary Earner, proposed by Luan Rodrigues:
let
Fonte = Tabela1,
tab2 = Tabela2,
fx = (valor as number) =>
let
Fonte = Tabela2,
fil = Table.SelectRows(Fonte, each [From] < valor),
ult = Table.LastN(fil, 1),
rem = Table.SelectColumns(ult, {"Deduction"})
in
rem,
p = Table.AddColumn(Fonte, "Ded", each fx([Salary])),
exp = Table.ExpandTableColumn(p, "Ded", {"Deduction"}),
add = Table.AddColumn(exp, "Personalizar", each [Salary] * (1 - [Deduction])),
max = List.Max(add[Personalizar]),
res = Table.SelectRows(add, each [Personalizar] = max)[[Names], [Salary]]
in
res
Power Query solution 5 for Top Net Salary Earner, proposed by Brian Julius:
let
Source = Excel.CurrentWorkbook(){[Name = "Table1"]}[Content],
AddAdjSalary = Table.AddColumn(
Source,
"AdjSalary",
each (
if [Salary] <= 40000 then
0.90
else if [Salary] <= 50000 then
0.75
else if [Salary] <= 60000 then
0.60
else
0.50
)
* [Salary]
),
RankNFilter = Table.SelectRows(
Table.AddRankColumn(
AddAdjSalary,
"Rankx",
{"AdjSalary", Order.Descending},
[RankKind = RankKind.Competition]
),
each [Rankx] = 1
),
CleanNSort = Table.Sort(
Table.RemoveColumns(RankNFilter, {"AdjSalary", "Rankx"}),
{"Salary", Order.Ascending}
)
in
CleanNSort
Power Query solution 6 for Top Net Salary Earner, proposed by Tyler N.:
let
Src = Table.AddColumn(
Table1,
"R",
each
let
a = Table2,
b = [Salary],
c = Table.SelectRows(a, each [From] < b),
d = Table.Last(Table.AddColumn(c, "net", each b * (1 - [Deduction])))
in
d[net]
),
Fin = Table.SelectRows(Src, each [R] = List.Max(Src[R]))
in
Fin
Solving the challenge of Top Net Salary Earner with Excel
Excel solution 1 for Top Net Salary Earner, proposed by Bo Rydobon 🇹🇭:
=LET(a,B2:B10,b,a*(1-LOOKUP(a,D2:F5)),FILTER(A2:B10,b=MAX(b)))
Excel solution 2 for Top Net Salary Earner, proposed by Rick Rothstein:
=LET(b,B2:B10,x,b*(1-XLOOKUP(b,D2:D5,F2:F5,,-1)),FILTER(A2:B10,x=MAX(x)))
Excel solution 3 for Top Net Salary Earner, proposed by John V.:
=LET(s,B2:B10,d,s-s*LOOKUP(s,D2:F5),FILTER(A2:B10,d=MAX(d)))
Excel solution 4 for Top Net Salary Earner, proposed by محمد حلمي:
=LET(b,B2:B10,r,b*(1-XLOOKUP(b,D2:D5,F2:F5,,-1)),FILTER(
A2:B10,r=MAX(r)))
Excel solution 5 for Top Net Salary Earner, proposed by محمد حلمي:
=LET(b,B2:B10,r,b*(1-VLOOKUP(b,D2:F5,3)),FILTER(A2:B10,r=MAX(r)))
Excel solution 6 for Top Net Salary Earner, proposed by Kris Jaganah:
=LET(a,B2:B10,c,(1-XLOOKUP(a,D2:D5,F2:F5,,-1))*a,FILTER(A2:B10,c=MAX(c)))
Excel solution 7 for Top Net Salary Earner, proposed by Timothée BLIOT:
=FILTER(A2:B10,LET(A,MAP(B2:B10,LAMBDA(a,a*XLOOKUP(a,E2:E5,1-F2:F5,,1))),A=MAX(A)))
After-tax income of each:
=SORT(HSTACK(A2:A10,MAP(B2:B10, LAMBDA(x, x-SUM(MAP(D2:D5,E2:E5,F2:F5, LAMBDA(a,b,t, MAX(MIN(b,x)-a,0)*t ))) ))),2,-1)
Excel solution 8 for Top Net Salary Earner, proposed by Oscar Mendez Roca Farell:
=LET(_b,B2:B10,_d,_b*XLOOKUP(_b, D2:D5, 1-F2:F5, ,-1), VSTACK({"Names","Salary"}, FILTER(A2:B10,_d=MAX(_d))))
Excel solution 9 for Top Net Salary Earner, proposed by Sunny Baggu:
=FILTER(A2:B10,LET(_val,B2:B10*(1-XLOOKUP(B2:B10,D2:D5,F2:F5,,-1)),_val=MAX(_val)))
2#
=FILTER(A2:B10,LET(_val,B2:B10*(1-VLOOKUP(B2:B10,D2:F5,3)),_val=MAX(_val)))
3#
=FILTER(A2:B10,LET(_val,B2:B10*(1-INDEX(F2:F5,MATCH(B2:B10,D2:D5,1))),_val=MAX(_val)))
Excel solution 10 for Top Net Salary Earner, proposed by Md. Zohurul Islam:
=LET(u,A2:A10,v,B2:B10,w,A1:B1,p,D2:D5,q,F2:F5,
a,v*(1-LOOKUP(v,p,q)),
VSTACK(w,FILTER(HSTACK(u,v),a=MAX(a))))
Excel solution 11 for Top Net Salary Earner, proposed by Tolga Demirci, PMP, PMI-ACP, MOS-Expert:
=LET(d;A2:A10;f;B2:B10;LET(u;LET(t;LAMBDA(y;LET(x;MAP(D2:D5;E2:E5;F2:F5;LAMBDA(p;o;i;IF(AND(y>=p;y<=o);(1-i)*y;"")));FILTER(x;x<>"")));LET(v;IFNA(MAP(MAP(f;t);d;LAMBDA(m;n;XLOOKUP(LARGE(MAP(f;t);1);m;n)));"");FILTER(v;v<>"")));HSTACK(u;XLOOKUP(u;d;f))))
Excel solution 12 for Top Net Salary Earner, proposed by Daniel Garzia:
=LET(s,B2:B10,d,s*(1-VLOOKUP(s,D2:F5,3)),FILTER(A2:B10,d=MAX(d)))
Excel solution 13 for Top Net Salary Earner, proposed by Rayan S.:
=LET(
x, A2:B10,
y, D2:F5,
t, HSTACK(x, TAKE(x, , -1) * (1 - VLOOKUP(TAKE(x, , -1), y, 3, 1))),
TAKE(SORTBY(t, TAKE(t, , -1), -1), 2, 2)
)
Excel solution 14 for Top Net Salary Earner, proposed by Hussain Ali Nasser:
=LET(_lookup,XLOOKUP(B2:B10,D2:D5,1-F2:F5,,-1)*B2:B10,FILTER(A2:B10,_lookup=MAX(_lookup)))
Excel solution 15 for Top Net Salary Earner, proposed by Ibrahim Sadiq:
=LET(a,B2:B10,b,a*(1-INDEX(F2:F5,MATCH(a,D2:D5,1))),FILTER(A2:B10,b=MAX(b)))
Excel solution 16 for Top Net Salary Earner, proposed by Amr Tawfik CMA®,FMVA,Lean Coach:
=LET(a,B2:B10,x,a-(a*LOOKUP(a,D2:D5,F2:F5)),xx,FILTER(A2:B10,x=MAX(x)),xx)
Excel solution 17 for Top Net Salary Earner, proposed by Amr Tawfik CMA®,FMVA,Lean Coach:
=LET(a,B2:B10,x,a-(a*LOOKUP(a,D2:D5,F2:F5)),FILTER(A2:B10,x=MAX(x)))
Excel solution 18 for Top Net Salary Earner, proposed by Enrico Giorgi:
=LET(deductions,XLOOKUP(B2:B10,D2:D5,F2:F5,,-1),net,(1-deductions)*B2:B10,max_net,MAX(net),FILTER(A2:B10,net=max_net))
ITALIAN VERSION
=LET(deductions;CERCA.X(B2:B10;D2:D5;F2:F5;;-1);net;(1-deductions)*B2:B10;max_net;MAX(net);FILTRO(A2:B10;net=max_net))
Solving the challenge of Top Net Salary Earner with Python in Excel
Python in Excel solution 1 for Top Net Salary Earner, proposed by Alejandro Campos:
df = xl("A1:B10", headers=True)
df['Salary After Deduction'] = df['Salary'].apply(lambda s: next(s*(1-r['Deduction'])
for _,r in xl("D1:F5", headers=True).replace('No Limit', 10**6).iterrows() if r['From'] <= s <= r['To']))
result = pd.DataFrame(df.nlargest(2, 'Salary After Deduction'), columns=['Names', 'Salary']).set_index('Names').reset_index()
&&&
