Build or improve your Power BI reporting
Reports, data models and DAX, with handover built into the work. I can help with one report or a wider Power BI workspace.
Power BI consulting · Christchurch, NZ
I'm Mike Ryan. I build Power BI reports and data models your team can use, understand and maintain.
10+ years in business intelligence
5+ years consulting
One consultant.
Working directly with you.
From one stubborn report to a more dependable reporting platform.
Reports, data models and DAX, with handover built into the work. I can help with one report or a wider Power BI workspace.
I structure and improve the SQL and warehouse layers your reporting relies on, with performance and maintainability in mind.
I bring data from different systems together using SQL and Power Query, so your reports start with consistent, usable data.
I investigate slow reports, review how your Power BI environment is organised, and provide a second opinion before a wider change.
A small report I built on the Electricity Authority's public market data, covering every month since January 2022 from 6.9 million half-hourly generation readings. Pick a month, filter by island, or press play. It's built for the web so anyone can open it without a Power BI licence; the model and measures behind it are the ones I'd use in Power BI.
The model is a small star schema. Two fact tables share the date and island dimensions, so one slicer filters both.
The logic sits in three measures. In the Power BI model they are:
Generation GWh =
DIVIDE ( SUM ( Generation[kWh] ), 1000000 )
Renewable share =
DIVIDE (
CALCULATE ( [Generation GWh], Fuel[Renewable] = TRUE () ),
[Generation GWh]
)
Wholesale price =
-- Benmore for the South Island, otherwise Ōtāhuhu
VAR NodeCode =
IF ( SELECTEDVALUE ( Island[Island] ) = "SI", "BEN2201", "OTA2201" )
RETURN
CALCULATE (
AVERAGE ( Price[Dollars per MWh] ),
Node[Code] = NodeCode
)
A short script downloads the monthly files from EMI, stops if any station or fuel code is unmapped, and reduces them to a 7 KB file for this page. It checks for new data each month.
Source: Electricity Authority, EMI market data, licensed CC BY 4.0. Grid-metered generation; rooftop solar is not included. Renewable share counts hydro, geothermal, wind and solar; official MBIE figures also count wood, so they run slightly higher. Wood, diesel and battery output is shown as other. Prices are the monthly average of every half-hourly final price, at Ōtāhuhu (Auckland) and at Benmore (South Island), each shown separately.
I bring 10+ years in business intelligence and 5+ years in consulting. Power BI is my main focus today. I handle the work from the first discussion through delivery and handover.
My work has covered dairy manufacturing, energy and fuel distribution, telecommunications, ports and logistics, agricultural machinery, health and social services, and workforce software.
I care about reliable numbers, models another person can maintain, and reports that remain useful after handover.
Onsite in Christchurch or remotely, as agreed.
Both exclude GST.
Tell me what you need from your reporting and what is getting in the way. The initial scoping conversation is free.
I work on a time and materials basis, with a weekly view of the hours spent.
I'm enthusiastic about what AI can do for everyday work. I use AI tools to speed up development and problem-solving, and I'm happy to share the tools and approaches I use so your team can build confidence with AI too.
Documentation and knowledge transfer are part of delivery, so your team can maintain what I build.
I work mainly in Power BI, SQL Server and SQL. I use Microsoft Fabric where it fits the work, and have working knowledge of Databricks.
Open source
Use AI with a Power BI model without handing it your customers' names.
cloakroom sits between an AI agent and a Power BI model. Values in the columns you choose are swapped for stable tokens before the agent sees them, and swapped back on the way in, so the analysis still works. The mapping stays on your machine.
View cloakroom on GitHubEVALUATE TOPN ( 4, SUMMARIZECOLUMNS ( Customer[Name], Customer[Email], "Revenue", [Revenue] ), [Revenue] )
| Customer[Name] | Customer[Email] | [Revenue] |
|---|---|---|
| Contoso Ltd | [email protected] | 412,380 |
| Fabrikam Inc | [email protected] | 298,145 |
| Northwind Traders | [email protected] | 187,902 |
| Tailspin Toys | [email protected] | 96,440 |
Without cloakroom, the names and emails go into the AI model's context.
When the agent filters on "Client 2", cloakroom translates it back to Fabrikam Inc before the query reaches your model.
Illustration using Microsoft's sample company names. Numbers pass through unchanged.
Email me a brief outline of the problem, or call me.
The first scoping conversation is free.