Excelgoodies logo +1 650 491 3131

LEARN THIS HANDS ON

Power BI Reporting

ET . Live Online FILLING FAST
View all upcoming batches
Power BI for Businesses in Chicago, Illinois: Getting Real Value from Local Data

Power BI for Businesses in Chicago, Illinois: Getting Real Value from Local Data

Most Chicago teams already have a few Power BI reports: a sales dashboard, an operations scorecard, maybe something for finance. The pain usually starts when those reports need to combine local data sources (ERP on-prem, city open data, logistics feeds) and still refresh reliably for a distributed team across downtown, the suburbs, and remote workers.

This article walks through a realistic scenario of a Chicago business tightening up its Power BI setup: data sources, refresh, security, and performance tuned for a mix of on-prem and cloud systems.


Scenario: Regional Operations Team with Mixed On-Prem and Cloud Data

Imagine a regional operations team based in the Loop supporting:

  • 20+ branch locations across Chicago and nearby suburbs
  • An on-prem SQL Server instance in a local data center
  • A legacy ERP running on-prem
  • A newer SaaS CRM and workforce management tool

They’ve built a Power BI report that tracks:

  • Daily store traffic (from POS via SQL Server on-prem)
  • Delivery performance (from a logistics SaaS API via CSV exports in OneDrive)
  • Local external data (Chicago city open data — permits, traffic, etc.)

Symptoms:

  • Refresh failures on days with heavy traffic
  • Slow visuals when filtering by neighborhood or ZIP code
  • Confusion about who can see which store’s performance
  • Inconsistent numbers between the Power BI report and the ERP

We’ll keep this scenario in view while walking through design decisions that matter for Power BI for businesses in Chicago, Illinois.


Choosing the Right Connectivity: Import, DirectQuery, or Live Connection

The first decision that affects everything else is how the Chicago operations dataset connects to source systems.

Import vs DirectQuery for On-Prem SQL Server

For the POS and ERP data in SQL Server on-prem, you typically have two options:

  • Import mode

    • Data is loaded into the VertiPaq storage engine in the dataset.
    • Best performance for most reporting and aggregations.
    • Refreshes are scheduled (not real-time).
  • DirectQuery mode

    • Queries are sent to SQL Server at run time for each visual interaction.
    • Data is always current as of the source.
    • Performance depends on network latency, SQL Server configuration, and query complexity.

For our Chicago operations team:

  • POS data changes frequently but doesn’t need second-by-second freshness.
  • ERP data changes throughout the day but key stakeholders mainly review daily and weekly trends.

A practical pattern:

  • Use Import mode for POS and ERP fact tables.
  • Use scheduled refresh at a cadence that matches operational needs (e.g., every hour during business hours, if capacity and gateway resources allow).

This avoids:

  • DirectQuery performance issues over VPN or constrained links to the local data center.
  • Complex tuning of SQL Server for interactive workloads.

If you do need near-real-time metrics (e.g., same-hour delivery SLA monitoring), consider:

  • A small DirectQuery table for a narrow, low-volume fact (like events in the last few hours).
  • Or a push dataset / streaming dataset for a focused real-time tile, separate from the main report.

Both options have constraints on modeling and visuals compared to standard Import datasets, so keep the real-time surface small and targeted.

Live Connection to Analysis Services or Fabric

If your Chicago business already has:

  • A centralized semantic model in Azure Analysis Services, or
  • A Power BI semantic model in a central workspace (including Fabric-based models),

then a live connection or thin report pattern is usually better than building separate models in each department.

For our scenario, that might mean:

  • A central semantic model with core sales, inventory, and customer tables.
  • Operations building a thin report on top, adding local visuals and bookmarks.

This reduces:

  • Duplicated measures and logic across teams.
  • Version drift between what finance and operations see.

Handling Chicago-Specific Data: Geospatial, Boundaries, and External Feeds

Local data is where Chicago businesses can differentiate. Common sources:

  • ZIP codes and neighborhoods
  • City open data (permits, crime, traffic, inspections)
  • Transit and mobility data

Geospatial Modeling: ZIPs, Neighborhoods, and Custom Regions

Power BI’s standard map visuals can work well if you model geography carefully.

Key points:

  • Use separate columns for:

    • ZipCode (text, 5 characters — don’t store as whole number to avoid leading zero issues)
    • City (e.g., Chicago) when needed
    • County or Region for broader grouping
  • For Chicago neighborhood analysis, you usually need a custom boundary file:

    • Create a shapefile or GeoJSON with neighborhood polygons.
    • Import via Shape map visual (requires enabling the shape map visual in the report settings, and using supported formats).

Once loaded, you can:

  • Map store performance to neighborhood by joining store coordinates or ZIP to the neighborhood table.
  • Use the shape map to show performance by neighborhood instead of by ZIP alone.

Integrating City of Chicago Open Data

Most city datasets expose:

  • CSV or JSON download endpoints
  • API endpoints with pagination and filters

For Power BI:

  • Use Power Query (M) to connect to the HTTP endpoints.
  • Apply transformations to:
    • Remove unused columns
    • Normalize date/time fields
    • Filter to relevant records (e.g., last 2 years)

Example Power Query snippet for a CSV endpoint (simplified):

let
    Source = Csv.Document(
        Web.Contents("https://data.cityofchicago.org/resource/xxxx.csv", [
            Query = [
                "$select" = "permit_number,issue_date,work_description,zip_code",
                "$where" = "issue_date >= '2024-01-01'"
            ]
        ]),
        [Delimiter = ",", Encoding = 65001, QuoteStyle = QuoteStyle.Csv]
    ),
    PromoteHeaders = Table.PromoteHeaders(Source, [PromoteAllScalars = true]),
    ChangeTypes = Table.TransformColumnTypes(
        PromoteHeaders,
        {
            {"permit_number", type text},
            {"issue_date", type datetime},
            {"work_description", type text},
            {"zip_code", type text}
        }
    )
in
    ChangeTypes

This approach:

  • Keeps the API call within Power Query’s supported HTTP features.
  • Applies query folding at the API level only when the provider supports it; otherwise, filters are applied client-side.

For production use with city data:

  • Cache via Import mode.
  • Set refresh frequency according to how often the dataset is updated (daily or weekly is usually enough).

Refresh Architecture for Chicago On-Prem + Cloud Mix

Our operations team’s biggest pain is failed refreshes on busy days. The triggers usually are:

  • Gateway overload or misconfiguration
  • Long-running Power Query steps against on-prem sources
  • Network bottlenecks between the local data center and Power BI service

Using the On-Premises Data Gateway Correctly

For on-prem SQL Server and ERP:

  • Install the standard on-premises data gateway on a server with:

    • Reliable connectivity to SQL Server and ERP
    • Adequate CPU and memory for concurrent queries
  • Register it in the Power BI service and configure data source connections:

    • Match the server and database names used in Power Query to those configured in the gateway.
    • Use appropriate authentication (SQL auth or Windows auth) that has read access.

Operational practices that help:

  • Use a dedicated gateway for production workloads rather than sharing with ad-hoc or dev workloads.
  • Monitor gateway logs and metrics to understand:
    • Concurrent refreshes
    • Query durations
    • Failures tied to specific data sources

Scheduling Refresh for Chicago Working Patterns

For hourly or multi-daily refreshes:

  • Use scheduled refresh in the workspace settings.
  • Avoid stacking refreshes for many large datasets at the same exact times.

For our scenario, a pattern might be:

  • POS/ERP dataset: refresh every 60–90 minutes during local business hours.
  • City open data: refresh once nightly.
  • Logistics CSV from OneDrive: refresh every 2–4 hours, depending on how often files are updated.

This reduces contention on the gateway and the Power BI service capacity, especially if you’re on shared capacity rather than a dedicated capacity.

If you’re using Power BI Premium or Fabric capacities:

  • You can schedule more frequent refreshes.
  • You also need to watch capacity metrics to avoid throttling or degraded performance.

Row-Level Security for Store and Region-Based Access

The Chicago operations team needs store managers to see only their own locations, while regional leaders and HQ see broader views.

Power BI supports row-level security (RLS) on Import and DirectQuery datasets.

Modeling for RLS

Use a model like:

  • Stores dimension with columns:

    • StoreID (unique key)
    • StoreName
    • Region
    • ZipCode
  • UserStoreAccess bridge table with:

    • UserPrincipalName (UPN, e.g., user@company.com)
    • StoreID

Relate:

  • UserStoreAccess[StoreID] to Stores[StoreID] (many-to-one).
  • Stores to fact tables via StoreID.

Defining Roles

In Power BI Desktop, define a role such as StoreManager with a DAX filter on UserStoreAccess:

[UserPrincipalName] = USERPRINCIPALNAME()

This role:

  • Filters UserStoreAccess to rows where UserPrincipalName matches the current user.
  • Propagates the filter to Stores and then to fact tables via relationships.

For regional leaders, you might use a role that filters by region:

Stores[Region] IN {"North", "Central"}

In the Power BI service:

  • Assign users or security groups to these roles.
  • Test with the “View as” feature to confirm behavior.

If you move to Power BI Premium and use object-level security (OLS) on the semantic model, you can hide sensitive columns (e.g., margin percentages) for certain roles while still exposing aggregated measures. But OLS is more advanced and requires careful testing; don’t mix it in unless you have a clear need.


Performance Tuning for Dense, Localized Reports

The Chicago operations report has filters on store, neighborhood, ZIP, and time. Users complain about slow visuals when slicing by multiple dimensions.

Performance fixes usually come from:

  1. Better modeling
  2. Efficient DAX
  3. Cleaner visuals

Model Design

For Import mode datasets:

  • Keep a star schema:

    • Fact tables for transactions (sales, deliveries, visits).
    • Dimensions for stores, dates, products, customers, geography.
  • Avoid:

    • Many-to-many relationships unless necessary.
    • Bi-directional relationships except where they’re clearly needed.

For example:

  • Use a single Date table marked as a date table.
  • Use one direction of filtering from dimensions to facts.

DAX Measures That Scale

Common performance pitfalls:

  • Repeated use of CALCULATE with complex filters when a simpler measure would work.
  • Use of row-context functions like SUMX over large tables when a simple aggregation is enough.

Example of a straightforward measure for daily sales per store:

Total Sales = SUM('FactSales'[SalesAmount])

Sales Last 30 Days = CALCULATE( [Total Sales], DATESINPERIOD( 'Date'[Date], MAX('Date'[Date]), -30, DAY ) )

This measure:

  • Uses a standard time-intelligence pattern.
  • Relies on a well-structured Date dimension.

If performance is still an issue:

  • Use Performance Analyzer in Power BI Desktop to see which visuals and queries are slow.
  • Optimize the worst offenders by:
    • Reducing the number of measures used in a single visual.
    • Limiting high-cardinality fields on slicers and filters.

Visual Design

For dense operational dashboards:

  • Prefer:

    • A few focused visuals per page.
    • Drill-through pages for detail.
  • Avoid:

    • Pages with many complex visuals all querying large fact tables simultaneously.

For our scenario, a pattern might be:

  • Main page: KPIs and high-level charts for Chicago overall.
  • Secondary pages: store-level detail, neighborhood maps, delivery performance.
  • Drill-through from store cards to a detailed store performance page.

Governance and Workspace Layout for Chicago Teams

As the Chicago business grows, different teams will want their own reports. Without structure, you end up with duplicated datasets and conflicting metrics.

A workable pattern:

  • Core Data workspace

    • Hosts semantic models/datasets for sales, operations, finance.
    • Managed by a central BI or data team.
  • Department workspaces (Operations, Finance, Marketing)

    • Host thin reports connected to the core semantic models.
    • Department leads own report layout, bookmarks, and narratives.

For our operations team:

  • Their Chicago operations report lives in the Operations workspace.
  • It connects to the central RetailOperations semantic model in the Core Data workspace.

Benefits:

  • Single source of truth for measures.
  • Local flexibility in report design.

If you’re on Power BI Premium or Fabric capacities, you can also:

  • Assign key workspaces (Core Data, Operations) to dedicated capacities.
  • Use capacity metrics to decide when to scale or reorganize workloads.

Practical Takeaway for Chicago Businesses

For Power BI for businesses in Chicago, Illinois, the main win comes from a clean split: central semantic models and gateway configuration handled once, with local reports layering Chicago-specific geography, city data, and operational views on top. If your team is fighting refresh failures or inconsistent numbers, start by tightening that core model and gateway setup before you add new visuals — most of the pain goes away when the foundation is stable.

Editor's Note

This article reflects how Chicago-based teams are standardizing Power BI models and refresh architecture while layering local geography and city data on top, a pattern that matters most in mixed on-prem and cloud environments with multiple departments sharing the same metrics.

Professionals who want to apply these patterns to their own data can explore Excelgoodies' Power BI Training in Chicago, Illinois 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.

Power BI

New

Next Batches Now Live

Power BIPower BI
SQLSQL
Power AppsPower Apps
Power AutomatePower Automate
Microsoft FabricMicrosoft Fabrics
AzureAzure Data Engineering
Explore Dates & Reserve Your Spot → Reserve Your Spot →