Business Professionals
Power BI | Power Pivot | Power Query | DAX
Cloud Flows | RPA | AI Builder | Copilot
60+ Formulas | Data Stories | Advanced Reporting & Modeling
VB Programming | Report Automation |
MS-Office Automation
Techno-Business Professionals
Power BI | Power Query | Advanced DAX | SQL - Query &
Programming
Microsoft Fabric | Power BI | Power Query | Advanced DAX |
SQL - Query & Programming
Power BI | Power Apps | Power Automate | Copilot Studio | Power Pages | Dataverse
Microsoft Power Apps | Microsoft Power Automate
Power BI | Adv. DAX | SQL (Query & Programming) |
VBA | Python | Web Scrapping | API Integration
Power BI | Power Apps | Power Automate |
SQL (Query & Programming)
Power BI | Adv. DAX | Power Apps | Power Automate |
SQL (Query & Programming) | VBA | Python | Web Scrapping | API Integration
Power Apps | Power Automate | SQL | VBA | Python |
Web Scraping | RPA | API Integration
Technology Professionals
Power BI | DAX | SQL | ETL with SSIS | SSAS | VBA | Python
Power BI | SQL | Azure Data Lake | Synapse Analytics |
Data Factory | Databricks | Power Apps | Power Automate |
Azure Analysis Services
Microsoft Fabric | Power BI | SQL | Lakehouse |
Data Factory (Pipelines) | Dataflows Gen2 | KQL | Delta Tables | Power Apps | Power Automate
Power BI | Power Apps | Power Automate | SQL | VBA | Python | API Integration
Power BI | Advanced DAX | Databricks | SQL | Lakehouse Architecture
Business Professionals
Power BI | Power Pivot | Power Query | DAX
Cloud Flows | RPA | AI Builder | Copilot
60+ Formulas | Data Stories | Advanced Reporting & Modeling
VB Programming | Report Automation |
MS-Office Automation
Techno-Business Professionals
Power BI | Power Query | Advanced DAX | SQL - Query &
Programming
Microsoft Fabric | Power BI | Power Query | Advanced DAX |
SQL - Query & Programming
Power BI | Power Apps | Power Automate | Copilot Studio | Power Pages | Dataverse
Microsoft Power Apps | Microsoft Power Automate
Power BI | Adv. DAX | SQL (Query & Programming) |
VBA | Web Scrapping | API Integration
Power BI | Power Apps | Power Automate |
SQL (Query & Programming)
Power BI | Adv. DAX | Power Apps | Power Automate |
SQL (Query & Programming) | VBA | Web Scrapping | API Integration
Power Apps | Power Automate | SQL | VBA |
Web Scraping | RPA | API Integration
Technology Professionals
Power BI | DAX | SQL | ETL with SSIS | SSAS | VBA
Power BI | SQL | Azure Data Lake | Synapse Analytics |
Data Factory | Azure Analysis Services
Microsoft Fabric | Power BI | SQL | Lakehouse |
Data Factory (Pipelines) | Dataflows Gen2 | KQL | Delta Tables
Power BI | Power Apps | Power Automate | SQL | VBA | API Integration
Power BI | Advanced DAX | Databricks | SQL | Lakehouse Architecture
LEARN THIS HANDS ON
Microsoft Excel Reporting
Phoenix teams usually feel the pain in Excel when the month-end ops workbook takes minutes to recalc, or when a single wrong date wrecks a service-level report tied to local time and heat-driven demand. This article walks through a practical scenario and the specific Excel formulas that make day-to-day decisions in a Phoenix, Arizona business faster, more reliable, and easier to audit.
Imagine an operations team managing technicians across the Phoenix metro area.
They track:
Data lands in a single Excel file from multiple sources:
Symptoms:
We'll fix this with a focused set of Excel formulas and patterns, not a giant overhaul.
Before we touch formulas, we need a stable layout.
Assume a table named Jobs with these columns:
JobIDTechIDCustomerZIPScheduledStart (Excel datetime, local Phoenix time)ActualArrival (datetime, local)JobType (e.g. "Install", "Repair")Status (e.g. "Completed", "Cancelled")BasePriceAnd a separate table named Weather:
Date (Excel date, local)HighTempFHeatFlag (TRUE/FALSE for days above a threshold)Make them Excel Tables (Ctrl+T) so we can use structured references, which are:
Phoenix is on Mountain Standard Time (UTC-7) year-round and does not observe daylight saving time.
In practice:
If ScheduledUTC is a datetime column in a raw import table RawJobs, convert to local in a helper column before any further logic:
=RawJobs[@ScheduledUTC] - TIME(7,0,0)
This works because:
Use this converted local field (ScheduledStart) everywhere else so your SLA and surge logic are consistent.
Phoenix service businesses often promise an arrival window (e.g. 9–11 AM) and track:
Assume Jobs has two extra columns:
WindowStart (time)WindowEnd (time)Create a ArrivalStatus column in Jobs:
=IF(
OR(Jobs[@Status]<>"Completed", ISBLANK(Jobs[@ActualArrival])),
"Not Completed",
IF(
TIME(HOUR(Jobs[@ActualArrival]), MINUTE(Jobs[@ActualArrival]), SECOND(Jobs[@ActualArrival]))
<= Jobs[@WindowEnd],
"On Time",
"Late"
)
)
Why this pattern:
TIME(HOUR(...), MINUTE(...), SECOND(...)) isolates the time portion, ignoring the dateIF guards against counting cancelled or incomplete jobsYou want monthly SLA rates that don't break when the month rolls.
Add a MonthStart named formula using LET for clarity (Excel 365 / Excel 2021+):
=LET(
today, TODAY(),
EOMONTH(today, -1) + 1
)
Then in a summary cell for current month SLA:
=LET(
monthStart, EOMONTH(TODAY(), -1) + 1,
monthEnd, EOMONTH(TODAY(), 0),
inMonth, (Jobs[ScheduledStart] >= monthStart) * (Jobs[ScheduledStart] <= monthEnd),
completedOnTime,
(Jobs[ArrivalStatus] = "On Time") * (Jobs[Status] = "Completed") * inMonth,
totalCompleted,
(Jobs[Status] = "Completed") * inMonth,
IF(
SUM(totalCompleted) = 0,
NA(),
SUM(completedOnTime) / SUM(totalCompleted)
)
)
Key points:
Jobs[...] = "On Time") evaluate to 0/1 in arithmetic contextsLET function avoids recalculating the same logic multiple times, improving clarity and performanceNA() is used instead of 0 when no jobs exist in the month, preventing misleading 0% SLAThis pattern is efficient in modern Excel because it uses a single dynamic array expression, not thousands of row-level formulas.
Summer heat in Phoenix drives demand and sometimes surge pricing.
Assume the pricing rule:
HeatFlag = TRUE, add a 15% surcharge on BasePriceWe need a robust way to join Jobs to Weather by date.
XLOOKUPAdd a JobDate column in Jobs:
=INT(Jobs[@ScheduledStart])
This strips the time portion, leaving the date.
Now add IsHeatDay:
=LET(
jobDate, Jobs[@JobDate],
XLOOKUP(
jobDate,
Weather[Date],
Weather[HeatFlag],
FALSE,
0
)
)
Explanation:
XLOOKUP returns Weather[HeatFlag] where Weather[Date] = jobDateFALSE (the 4th argument) so the surcharge doesn't apply0 enforces exact match, avoiding nearest-date surprisesAdd FinalPrice:
=LET(
base, Jobs[@BasePrice],
heat, Jobs[@IsHeatDay],
surchargeRate, 0.15,
IF(heat,
base * (1 + surchargeRate),
base
)
)
This keeps logic readable and makes it easy to adjust the surcharge rate in one place.
Many Phoenix businesses want metrics by ZIP code for routing and marketing.
Assume a summary table ZipSummary with column CustomerZIP listing each ZIP you serve.
In ZipSummary, add JobsThisMonth:
=LET(
monthStart, EOMONTH(TODAY(), -1) + 1,
monthEnd, EOMONTH(TODAY(), 0),
zip, ZipSummary[@CustomerZIP],
inZip, (Jobs[CustomerZIP] = zip),
inMonth, (Jobs[ScheduledStart] >= monthStart) * (Jobs[ScheduledStart] <= monthEnd),
SUM(inZip * inMonth)
)
Add OnTimeRateThisMonth:
=LET(
monthStart, EOMONTH(TODAY(), -1) + 1,
monthEnd, EOMONTH(TODAY(), 0),
zip, ZipSummary[@CustomerZIP],
inZip, (Jobs[CustomerZIP] = zip),
inMonth, (Jobs[ScheduledStart] >= monthStart) * (Jobs[ScheduledStart] <= monthEnd),
completed, (Jobs[Status] = "Completed") * inZip * inMonth,
onTime, (Jobs[ArrivalStatus] = "On Time") * completed,
totalCompleted, SUM(completed),
IF(totalCompleted = 0,
NA(),
SUM(onTime) / totalCompleted
)
)
These formulas:
SUMIFS chains in favor of a single dynamic array expression, which scales wellPhoenix operations teams often run these workbooks on standard office hardware, not high-end machines. A few formula choices make the difference between instant and sluggish.
In modern Excel (Microsoft 365, Excel 2021+), you can:
LET-based formula in a summary sheetFor example, a dynamic array for monthly SLA by ZIP:
Assume ZipSummary[CustomerZIP] is a single column list and you want a separate array calculation instead of row-by-row formulas:
=LET(
zips, ZipSummary[CustomerZIP],
monthStart, EOMONTH(TODAY(), -1) + 1,
monthEnd, EOMONTH(TODAY(), 0),
jobZips, Jobs[CustomerZIP],
sched, Jobs[ScheduledStart],
status, Jobs[Status],
arrival, Jobs[ArrivalStatus],
inMonth, (sched >= monthStart) * (sched <= monthEnd),
completed, (status = "Completed") * inMonth,
onTime, (arrival = "On Time") * completed,
BYROW(
zips,
LAMBDA(zip,
LET(
zipMask, (jobZips = zip),
totalCompleted, SUM(completed * zipMask),
IF(
totalCompleted = 0,
NA(),
SUM(onTime * zipMask) / totalCompleted
)
)
)
)
)
This:
BYROW and LAMBDA to avoid manual copyingVolatile functions recalc every change. For a busy workbook, that matters.
Common volatile functions:
OFFSETINDIRECTTODAY (volatile, but acceptable in a few summary cells)NOWPatterns to prefer:
OFFSETINDEX with explicit ranges instead of INDIRECT where possibleTODAY() in a named formula or single cell and reference that, rather than sprinkling it across many formulasExample: centralizing TODAY() in a cell Config!B1:
=TODAY()
Then in formulas:
=LET(
today, Config!$B$1,
monthStart, EOMONTH(today, -1) + 1,
monthEnd, EOMONTH(today, 0),
...
)
This reduces recalculation overhead when you have many date-based expressions.
A few checks help keep the workbook trustworthy.
If some timestamps are UTC and some are local, SLA logic breaks.
Add a TimeCheck helper column in Jobs:
=IF(
Jobs[@ScheduledStart] <> INT(Jobs[@ScheduledStart]) + TIME(HOUR(Jobs[@ScheduledStart]), MINUTE(Jobs[@ScheduledStart]), SECOND(Jobs[@ScheduledStart])),
"Unexpected Format",
"OK"
)
Use this primarily to flag imported values that come in as text or inconsistent datetime formats. Filter on "Unexpected Format" and fix upstream.
If Weather is incomplete, pricing and heat analysis will be wrong.
In Jobs, add WeatherMissing:
=ISNA(
XLOOKUP(
Jobs[@JobDate],
Weather[Date],
Weather[HeatFlag],
NA(),
0
)
)
Then you can:
WeatherMissing = TRUE to see all jobs with no weather matchFor a Phoenix operations workbook that needs to survive real-world load, pick one area (SLA, pricing, or ZIP metrics), move the logic into a single LET-based dynamic array using tables and XLOOKUP, and strip out volatile functions and row-by-row formulas in that slice; you’ll see faster recalc, fewer broken reports at month-end, and a clearer path to expanding the model later.
This article reflects how Phoenix-based operations teams are consolidating time, weather, and ZIP-level data into structured Excel formula patterns that stay accurate under local time rules and heavy day-to-day usage.
Professionals who want to apply these patterns to their own data can explore Excelgoodies' Microsoft Excel Reporting Training in Phoenix, Arizona programme - taught live by instructors, with certification awarded once a real project is running at work.
Insights compiled through ongoing industry research and discussions within the Excelgoodies Analytics Community.
Excel Formulas
New
Next Batches Now Live
Power BI
SQL
Power Apps
Power Automate
Microsoft Fabrics
Azure Data Engineering