SAS Reporting Migration: SAS Visual Analytics to Power BI¶
Audience: Report Developers, Business Analysts, SAS VA Administrators Purpose: Migrate SAS Visual Analytics reports, SAS Stored Processes, ODS output, and SAS/GRAPH visualizations to Power BI, Power BI paginated reports, and Fabric notebooks.
1. Overview¶
SAS Visual Analytics (VA) is SAS's self-service BI and data exploration tool. Power BI is the Azure-native replacement that integrates with Fabric lakehouses, Azure ML, and the broader Microsoft ecosystem. This migration is typically the lowest-risk, highest-ROI first step in a SAS-to-Azure journey because Power BI is a mature product with no code conversion required --- reports are rebuilt, not translated.
| SAS VA concept | Power BI equivalent | Notes |
|---|---|---|
| VA Report | Power BI Report (.pbix) | Rebuilt in Power BI Desktop or Power BI Service |
| VA Exploration | Power BI Explore / Analyze in Excel | Self-service data exploration |
| VA Data Source | Semantic Model (Direct Lake or Import) | Direct Lake over Fabric lakehouses is preferred |
| VA Prompt (parameter) | Power BI Slicer / Filter | Slicers provide equivalent filtering |
| VA Geographic Map | Power BI Map / Azure Maps visual | Built-in map visuals |
| VA Network Diagram | Power BI custom visuals (Force-Directed Graph) | Requires AppSource custom visual |
| VA Word Cloud | Power BI Word Cloud visual | AppSource custom visual |
| VA Gauge | Power BI Gauge / KPI visual | Built-in |
| VA Waterfall Chart | Power BI Waterfall Chart | Built-in |
| VA Heat Map | Power BI Matrix with conditional formatting | Built-in |
| SAS Stored Process | Power BI Paginated Report (SSRS-based) | Parameterized, scheduled, pixel-perfect output |
| ODS HTML output | Power BI web report / notebook HTML export | Power BI is interactive; notebooks for static HTML |
| ODS PDF output | Power BI paginated report (PDF export) | Paginated reports export to PDF natively |
| ODS RTF output | Power BI paginated report (Word export) | Paginated reports export to Word/PDF |
| ODS Excel output | Power BI Export to Excel / Analyze in Excel | Native Excel integration |
2. Migration approach¶
2.1 Report inventory¶
Before migrating, inventory all SAS VA reports:
For each SAS VA report, document:
- Report name and description
- Data source (SAS table, LASR table, CAS table)
- Number of pages/sections
- Visual types used (bar, line, scatter, map, table, etc.)
- Prompts/parameters
- Filters (global, section, visual)
- Calculated columns / derived items
- User count (consumers and editors)
- Refresh frequency
- Distribution method (email, web, mobile)
- Criticality (high / medium / low)
2.2 Priority framework¶
| Priority | Report characteristics | Migration order |
|---|---|---|
| High (migrate first) | Simple bar/line/table reports, few prompts, standard data sources, many consumers | Weeks 1--4 |
| Medium | Complex visuals, multiple data sources, calculated items, moderate prompt complexity | Weeks 4--8 |
| Low (migrate last) | Custom SAS VA objects, network diagrams, complex interactions, few consumers | Weeks 8--12+ |
3. Visual object mapping¶
3.1 Standard visuals¶
| SAS VA visual | Power BI visual | Configuration notes |
|---|---|---|
| Bar Chart | Bar Chart (Clustered/Stacked) | Drag fields to Axis, Values, Legend |
| Line Chart | Line Chart | Axis = date/category, Values = measure |
| Pie Chart / Donut | Pie Chart / Donut Chart | Category = Legend, Value = Values |
| Scatter Plot | Scatter Chart | X Axis, Y Axis, Size, Color (Legend) |
| Bubble Plot | Scatter Chart (with Size field) | Add Size field for bubble sizing |
| Treemap | Treemap | Group = category, Values = measure |
| Crosstab / Table | Table / Matrix | Rows, Columns, Values; Matrix for pivot-style |
| List Table | Table visual | Simple row/column table |
| Geographic Map | Map / Filled Map / Azure Maps | Latitude/Longitude or geographic hierarchy |
| Gauge | Gauge / KPI | Value, Target, Min/Max |
| Text Object | Text Box / Card visual | Static text or measure display |
| Container | Visual Container / Bookmark groups | Group visuals together |
| Button | Button / Bookmark navigator | Navigation and interactivity |
3.2 SAS VA calculated items to DAX measures¶
SAS VA calculated item (profit margin):
Power BI DAX measure:
SAS VA calculated item (year-over-year growth):
Power BI DAX measure:
YoY Growth =
VAR CurrentYear = SUM('Sales'[Revenue])
VAR PriorYear =
CALCULATE(
SUM('Sales'[Revenue]),
SAMEPERIODLASTYEAR('Calendar'[Date])
)
RETURN
DIVIDE(CurrentYear - PriorYear, PriorYear, 0)
SAS VA running total:
Power BI DAX:
Running Total =
CALCULATE(
SUM('Sales'[Revenue]),
FILTER(
ALL('Calendar'[Date]),
'Calendar'[Date] <= MAX('Calendar'[Date])
)
)
4. SAS VA prompts to Power BI slicers¶
4.1 Dropdown prompt to slicer¶
SAS VA prompt:
Prompt Name: Select Region
Type: Drop-down list
Data Source: DISTINCT region FROM fact_sales
Default: All
Multi-select: Yes
Power BI:
- Add a Slicer visual to the report page
- Drag the
Regionfield to the slicer - Format: Dropdown style, multi-select enabled
- Set "Select all" option to enabled
4.2 Date range prompt to date slicer¶
SAS VA:
Power BI:
- Add a Slicer visual
- Drag
Datefield - Format: Between (date range slider)
- Add relative date filtering: "is in the last 1 fiscal year"
4.3 Cascading prompts to synced slicers¶
SAS VA cascading prompts:
Power BI: Cascading is automatic in Power BI. When State slicer filters the data model, the City slicer automatically shows only cities in selected states. No additional configuration needed --- this is a core Power BI behavior.
5. SAS Stored Processes to Power BI paginated reports¶
SAS Stored Processes are parameterized server-side programs that generate formatted output (HTML, PDF, Excel). The Power BI equivalent is Paginated Reports (based on SQL Server Reporting Services / SSRS engine).
5.1 Feature mapping¶
| SAS Stored Process feature | Paginated Report equivalent |
|---|---|
| Input parameters | Report Parameters |
| HTML/PDF/RTF/Excel output | Export to PDF, Excel, Word, HTML, CSV, XML |
| Scheduled execution | Power BI subscriptions (email delivery) |
| Web URL invocation | Direct URL with parameter query string |
| SAS code execution | Dataset query (SQL, DAX, or stored procedure) |
| ODS formatting | Report Builder formatting (tables, charts, images) |
| Server-side caching | Report caching in Power BI Premium |
5.2 Migration steps¶
- Identify the data query in the SAS Stored Process (the PROC SQL or DATA Step that generates data)
- Recreate the query as a SQL query against the Fabric lakehouse or Azure SQL database
- Build the report layout in Power BI Report Builder
- Map parameters from SAS prompts to paginated report parameters
- Configure subscriptions for scheduled email delivery
- Publish to Power BI Premium workspace
6. Data source migration¶
6.1 SAS VA data sources to Power BI semantic models¶
| SAS VA data source | Power BI semantic model approach |
|---|---|
| SAS dataset (SAS7BDAT in LASR) | Direct Lake over Fabric lakehouse Delta table |
| CAS table (in-memory) | Direct Lake (Fabric handles caching) |
| SAS data view | dbt model materialized as Delta table, then Direct Lake |
| External database (via LIBNAME) | DirectQuery or Import mode |
| SAS Information Map | Power BI semantic model (star schema) |
6.2 Direct Lake semantic model (recommended)¶
Architecture:
SAS Data --> Delta Table (Fabric Lakehouse) --> Direct Lake Semantic Model --> Power BI Report
Direct Lake provides:
- No data movement (reads Delta files directly from OneLake)
- Near-real-time refresh (as Delta tables update, reports reflect changes)
- VertiPaq performance with lakehouse-scale data
- Single source of truth shared with notebooks, Azure ML, and SAS (via SAS on Fabric)
7. SAS/GRAPH to Python visualization¶
For reports that include SAS/GRAPH output embedded in ODS documents, the equivalent in csa-inabox is matplotlib/seaborn/plotly in Fabric notebooks.
7.1 PROC SGPLOT to matplotlib¶
SAS:
proc sgplot data=work.quarterly;
vbar quarter / response=revenue group=region groupdisplay=cluster;
xaxis label="Quarter";
yaxis label="Revenue ($M)" grid;
keylegend / title="Region" position=topright;
title "Quarterly Revenue by Region";
run;
Python (matplotlib):
import matplotlib.pyplot as plt
import numpy as np
fig, ax = plt.subplots(figsize=(12, 6))
quarters = df['quarter'].unique()
regions = df['region'].unique()
x = np.arange(len(quarters))
width = 0.8 / len(regions)
for i, region in enumerate(regions):
region_data = df[df['region'] == region]
values = [region_data[region_data['quarter'] == q]['revenue'].sum()
for q in quarters]
ax.bar(x + i * width, values, width, label=region)
ax.set_xlabel('Quarter')
ax.set_ylabel('Revenue ($M)')
ax.set_title('Quarterly Revenue by Region')
ax.set_xticks(x + width * (len(regions) - 1) / 2)
ax.set_xticklabels(quarters)
ax.legend(title='Region', loc='upper right')
ax.grid(axis='y', alpha=0.3)
plt.tight_layout()
plt.show()
7.2 PROC SGPANEL to seaborn FacetGrid¶
SAS:
proc sgpanel data=work.clinical;
panelby treatment / columns=2;
scatter x=baseline_score y=outcome / group=sex;
reg x=baseline_score y=outcome / group=sex;
rowaxis label="Outcome Score";
colaxis label="Baseline Score";
run;
Python (seaborn):
import seaborn as sns
g = sns.FacetGrid(df, col='treatment', col_wrap=2, height=5)
g.map_dataframe(sns.scatterplot, x='baseline_score', y='outcome', hue='sex')
g.map_dataframe(sns.regplot, x='baseline_score', y='outcome',
scatter=False, ci=None)
g.add_legend()
g.set_axis_labels('Baseline Score', 'Outcome Score')
plt.tight_layout()
plt.show()
8. Migration timeline¶
For a typical SAS VA estate with 30--80 reports:
| Week | Activity | Deliverables |
|---|---|---|
| 1 | Report inventory and prioritization | Inventory spreadsheet, priority tiers |
| 2--3 | Semantic model design | Star schema design, Direct Lake configuration |
| 3--5 | High-priority reports (top 10) | Power BI reports published to workspace |
| 5--8 | Medium-priority reports (next 20) | Power BI reports published |
| 8--10 | Stored Processes to paginated reports | Paginated reports published |
| 10--12 | Low-priority reports + validation | Remaining reports; user acceptance |
| 12--14 | Training and cutover | User training; SAS VA decommission |
9. Power BI advantages over SAS VA¶
| Capability | SAS VA | Power BI | Advantage |
|---|---|---|---|
| Natural language Q&A | Limited NLQ | Copilot + Q&A visual | Power BI |
| Mobile experience | SAS VA mobile app | Power BI mobile app (iOS/Android) | Comparable |
| Embedded analytics | SAS VA SDK | Power BI Embedded (REST API) | Power BI (richer API) |
| Real-time dashboards | SAS ESP integration | Direct Lake + streaming datasets | Power BI |
| Row-level security | SAS VA RLS | Power BI RLS (DAX-based) | Comparable |
| Excel integration | Limited | Analyze in Excel (live connection) | Power BI |
| Teams integration | None | Power BI in Teams tabs/chat | Power BI |
| AI visuals | SAS forecasting visual | Smart narrative, decomposition tree, anomaly detection, Copilot | Power BI |
| Licensing | Per-user or capacity (\(200K--\)500K/yr) | Power BI Pro ($10/user/mo) or Premium/Fabric capacity | Power BI (far lower cost) |
| Copilot | None | Power BI Copilot (natural language report creation) | Power BI |
10. Validation checklist¶
| Check | Method |
|---|---|
| Visual accuracy | Side-by-side comparison of SAS VA and Power BI for the same date range |
| Data accuracy | Compare aggregate values (sums, counts, averages) between SAS and Power BI |
| Filter/slicer behavior | Test each prompt/slicer combination; verify consistent filtering |
| Drill-down paths | Verify hierarchy navigation matches SAS VA interaction |
| Parameter passing | Test all parameter combinations for paginated reports |
| Mobile rendering | Test on iOS and Android devices |
| Performance | Page load time under 3 seconds for typical reports |
| Security | Verify RLS rules match SAS VA data-level security |
Maintainers: csa-inabox core team Last updated: 2026-04-30