<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>Forem: Bamgboye Simisola</title>
    <description>The latest articles on Forem by Bamgboye Simisola (@sims__).</description>
    <link>https://forem.com/sims__</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3859797%2F04c2be74-0ff6-4f21-ad24-5ff1df48dc6b.png</url>
      <title>Forem: Bamgboye Simisola</title>
      <link>https://forem.com/sims__</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://forem.com/feed/sims__"/>
    <language>en</language>
    <item>
      <title>Mastering Power Query in Power BI: A Complete Data Transformation Guide</title>
      <dc:creator>Bamgboye Simisola</dc:creator>
      <pubDate>Sun, 10 May 2026 06:16:40 +0000</pubDate>
      <link>https://forem.com/sims__/mastering-power-query-in-power-bia-complete-data-transformation-guide-5gjd</link>
      <guid>https://forem.com/sims__/mastering-power-query-in-power-bia-complete-data-transformation-guide-5gjd</guid>
      <description>&lt;p&gt;Power Query is the backbone of data preparation in Power BI. Before you can build stunning dashboards or write complex DAX, your data needs to be clean, consistently shaped, and properly related. In this guide, we'll use the real CodeSphere Hub dataset, comprising sales transactions, booking records, product info, and calendar data, to demonstrate every essential Power Query technique.&lt;/p&gt;

&lt;p&gt;The dataset includes 163,000+ sales rows spanning 2015–2020, a messy hotel bookings CSV full of nulls and inconsistencies, a product catalogue, and several lookup tables. Exactly the kind of real-world mess Power Query was built to handle.&lt;/p&gt;

&lt;h1&gt;
  
  
  Working with Power Query Editor
&lt;/h1&gt;

&lt;p&gt;The Power Query Editor is where all data transformation happens before data is loaded into Power BI's model. You access it by selecting Transform Data after importing a source, or from the Home ribbon in Power BI Desktop.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Foflc2qphmxa0hdd36bkz.webp" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Foflc2qphmxa0hdd36bkz.webp" alt="Image 1" width="800" height="415"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Key Interface Areas
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Query Panel (left)&lt;/strong&gt;: Lists all loaded tables. Our project has 12 queries including Sales, Data Cleaning, Calendar, and all lookup tables.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Data Preview (center)&lt;/strong&gt;: Shows a sample of your data. Columns are typed (date, text, number) and clickable for column-level operations.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Applied Steps (right)&lt;/strong&gt;: Every action you take is recorded here as a step you can edit, reorder, or delete. This is Power Query's version of version control.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Formula Bar&lt;/strong&gt;: Shows the M code behind each step, toggle it on from the View tab.&lt;/p&gt;

&lt;h2&gt;
  
  
  Data Profiling Techniques
&lt;/h2&gt;

&lt;p&gt;Before cleaning, you need to understand your data. Power Query has three built-in profiling views that surface quality issues instantly. Open them from View → Column Quality, Column Distribution, Column Profile.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fd7xdxxtmn4etkyz0hyan.webp" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fd7xdxxtmn4etkyz0hyan.webp" alt="Image 10" width="800" height="422"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Column Quality&lt;/strong&gt;&lt;br&gt;
Shows three metrics as a percentage bar at the top of each column: Valid (green), Error (red), and Empty/Null (gray). In the Data Cleaning table, you can immediately see that guest_name and payment_status have significant null rates.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Freusyy2qil3ep1hwprqi.webp" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Freusyy2qil3ep1hwprqi.webp" alt="Image 11" width="800" height="420"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Column Distribution&lt;/strong&gt;&lt;br&gt;
Shows value frequency as a histogram under each column. Instantly reveals skewed distributions, outlier spikes, or unexpected cardinalities. For example, the listing_city column's distribution would show the "LA"/"los angeles"/"Los Angeles" fragmentation.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fgw3f9pit9pcp64mv3udj.webp" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fgw3f9pit9pcp64mv3udj.webp" alt="Image 13" width="800" height="420"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Column Profile&lt;/strong&gt;&lt;br&gt;
The most detailed view — select a single column and see stats panel: min, max, average, count, distinct count, null count, and a value frequency chart. Available for the entire dataset (not just top 1,000 rows) when you change the profiling scope at the bottom status bar.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F9np00xmmaf28l6gcvxlx.webp" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F9np00xmmaf28l6gcvxlx.webp" alt="Image 12" width="800" height="428"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Handling Missing and Null Values
&lt;/h2&gt;

&lt;p&gt;The Data Cleaning table is a goldmine of real-world data quality issues — nulls in guest_name and payment_status, negative nights values, inconsistent boolean representations (True/False/Yes/No/n), and extra whitespace in guest names. Let's tackle each systematically.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;1. Removing Rows with Nulls&lt;/strong&gt;&lt;br&gt;
For columns where a null makes a row useless (e.g., missing booking_id), remove the row entirely.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fw4mqso02visogbbkxibp.webp" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fw4mqso02visogbbkxibp.webp" alt="Image 16" width="800" height="425"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2. Replacing Nulls with Default Values&lt;/strong&gt;&lt;br&gt;
For optional fields, replace nulls with a meaningful default rather than deleting the row. &lt;br&gt;
&lt;strong&gt;Default values&lt;/strong&gt;&lt;br&gt;
Replace with 0, mean or median for numerical fields&lt;br&gt;
Replace with “Unknown” for categorical fields&lt;br&gt;
Replace with business-defined defaults&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;Select the column&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Right-click&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Choose Replace Values&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fe4wvnoaaw2vxtg66vghp.webp" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fe4wvnoaaw2vxtg66vghp.webp" alt="Image 14" width="800" height="419"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fjzchh456i14wsff7naa8.webp" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fjzchh456i14wsff7naa8.webp" alt="Image 15" width="800" height="422"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;3. Removing Duplicates&lt;/strong&gt;&lt;br&gt;
Power Query can deduplicate on one or multiple key columns. For booking data, booking_id should be unique.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;Select the key column(s)&lt;br&gt;
— e.g., booking_id.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Home → Remove Rows → Remove Duplicates&lt;br&gt;
(or right-click the column → Remove Duplicates).&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fx31ubpz7h7ckdr2ug69u.webp" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fx31ubpz7h7ckdr2ug69u.webp" alt="Image 17" width="800" height="419"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;OR right-click the column → Remove Duplicates&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fi1c3irbu23e292qr9866.webp" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fi1c3irbu23e292qr9866.webp" alt="Image 18" width="800" height="419"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Creating Index Columns
&lt;/h2&gt;

&lt;p&gt;Index columns provide unique row identifiers, essential for building relationships, tracking row positions, and creating surrogate keys. Our CodeSphere Hub Sales table doesn't have a guaranteed unique row key, making an index column critical.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Open the target query
Select Fact Table in the Queries panel on the left.&lt;/li&gt;
&lt;li&gt;Navigate to Add Column → Index Column
In the ribbon, click Add Column tab, then click the dropdown arrow on Index Column.&lt;/li&gt;
&lt;li&gt;Choose your start value
Select From 1 (1-based) for human-readable IDs, or From 0 for zero-based indexing used in joins.&lt;/li&gt;
&lt;li&gt;Rename the column
Double-click the new Index column header and rename it.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fv9rrztpv7l5ssg51x1qc.webp" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fv9rrztpv7l5ssg51x1qc.webp" alt="Image 2" width="800" height="419"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Conditional Columns and Logic
&lt;/h2&gt;

&lt;p&gt;Conditional columns let you create new derived columns based on if/else logic, without writing complex DAX measures. In the Data Cleaning table, we can classify bookings by payment status and validity.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;Go to Add Column → Conditional Column&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Set up the first condition&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Add an else-if clause&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Set the else (default) value&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F2z935wa9m47kkmi9mztr.webp" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F2z935wa9m47kkmi9mztr.webp" alt="Image 3" width="800" height="422"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Column from Examples
&lt;/h2&gt;

&lt;p&gt;This is one of Power Query's most powerful AI-assisted features. You provide 1–3 example output values, and Power Query infers the transformation rule automatically. It's ideal when you know what output you want but don't know the exact M formula.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;Select column&lt;br&gt;
Click on the column header to highlight it.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Add Column → Column from Examples → From Selection&lt;br&gt;
A new editable column panel appears on the right.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Type your example output in the first cell&lt;br&gt;
For example, "los angeles" type Los Angeles, for "LA" type Los Angeles, for "San Fran" type San Francisco.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Press Enter after each example&lt;br&gt;
Power Query suggests a formula. Keep typing examples until the entire column looks correct. Click OK.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fiauqh4gonaan4nr8657y.webp" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fiauqh4gonaan4nr8657y.webp" alt="Image 4" width="800" height="422"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Grouping and Aggregation
&lt;/h2&gt;

&lt;p&gt;Group By is Power Query's equivalent of SQL's GROUP BY; it lets you summarise data by collapsing rows into aggregated results. This is useful before loading data, reducing model size and query load time.&lt;br&gt;
&lt;strong&gt;Common aggregation functions include:&lt;/strong&gt;&lt;br&gt;
Sum&lt;br&gt;
Count&lt;br&gt;
Average&lt;br&gt;
Minimum&lt;br&gt;
Maximum&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;Select the Sales query&lt;br&gt;
Make sure you're working on the right table.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Home → Group By&lt;br&gt;
The Group By dialogue opens.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Configure grouping&lt;br&gt;
Group By column: Region_Key. New column name: TotalQty. Operation: Sum. Column: Quantity_Sold.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Add a second aggregation (optional)&lt;br&gt;
Click Add aggregation. New column: TotalTransactions. Operation: Count Rows.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fmbquxkx36a3jmodfft7v.webp" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fmbquxkx36a3jmodfft7v.webp" alt="Image 5" width="800" height="420"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fxqziehwwxd0ekluj3luc.webp" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fxqziehwwxd0ekluj3luc.webp" alt="Image 6" width="800" height="428"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Pivoting and Unpivoting Columns
&lt;/h2&gt;

&lt;p&gt;The Pivot Demo.csv in our dataset is a perfect real-world example; it contains years as column headers (2015, 2016, 2017…) with metrics as rows. This "wide" format is common in exports but difficult to work with in Power BI's data model, which needs a "long" format.&lt;/p&gt;

&lt;p&gt;Unpivoting: Wide → Long (Most Common)&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;Load the Pivot Demo table&lt;br&gt;
It has columns: Metric, 2015, 2016, 2017, 2018, 2019, 2020.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Select the year columns (2015–2020)&lt;br&gt;
Hold Ctrl and click each year column header.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Transform → Unpivot Columns&lt;br&gt;
Power Query creates an Attribute column (the year) and a Value column (the number).&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Rename columns&lt;br&gt;
Rename Attribute to Year and Value to Amount.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Merging and Appending Queries
&lt;/h2&gt;

&lt;p&gt;When a dataset has two separate annual sales files, we have to look up tables (Regions, Gender, Categories) that need to be joined.&lt;/p&gt;

&lt;h3&gt;
  
  
  Appending Queries (Union / Stack Rows)
&lt;/h3&gt;

&lt;p&gt;Use Append when you want to combine tables with the same structure — like stacking 2019 and 2020 sales into one table.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;Home → Append Queries → Append Queries as New&lt;br&gt;
(creates a new query instead of modifying an existing one)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Select tables to combine.&lt;br&gt;
Choose three or more tables and add Sales 2019 and Sales 2020 to the list.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Click OK.&lt;br&gt;
Power Query stacks the rows. Columns are matched by name; mismatches produce nulls.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fkvqy7gxnkqwiryo0qf16.webp" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fkvqy7gxnkqwiryo0qf16.webp" alt="Image 7" width="800" height="417"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Merging Queries (SQL-style JOIN)
&lt;/h3&gt;

&lt;p&gt;Use Merge to bring lookup columns into your fact table. Let's enrich our Sales table with Region names from the Regions lookup.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;Select Sales query → Home → Merge Queries&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Select the right table:&lt;br&gt;
Choose Regions. Click Region_Key in both tables to set the join key.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Join Kind: Select Left Outer (all Sales rows + matching Region info).&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Expand the nested table column.&lt;br&gt;
Click the expand icon on the new Regions column. Uncheck all but Region and Country. Uncheck "Use original column name as prefix."&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fab9tt9pqz7q1lkid2m4q.webp" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fab9tt9pqz7q1lkid2m4q.webp" alt="Image 8" width="800" height="737"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Date and Time Transformations
&lt;/h2&gt;

&lt;p&gt;The Calendar table contains date-time strings in ISO format, like 2015-01-01T09:53:24. Proper date handling is critical for time intelligence in DAX.&lt;/p&gt;

&lt;h3&gt;
  
  
  Key Date Operations
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Change Type to Date&lt;/strong&gt;: Select Date_and_Time column → Transform → Data Type → Date/Time → Date.&lt;br&gt;
&lt;strong&gt;Extract Year/Month/Day&lt;/strong&gt;: Add Column → Date → Year / Month / Day. Creates integer columns useful for slicers.&lt;br&gt;
Extract Month Name: Add Column → Date → Month → Name of Month. Returns "January", "February", etc.&lt;br&gt;
&lt;strong&gt;Extract Day of Week&lt;/strong&gt;: Add Column → Date → Day → Day of Week. Returns 0 (Sunday) through 6 (Saturday) — or Name of Day for text.&lt;br&gt;
&lt;strong&gt;Calculate Date Difference&lt;/strong&gt;: Use a Custom Column with an M formula to find the duration between dates.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fy1ve7ib54zx06scvezr5.webp" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fy1ve7ib54zx06scvezr5.webp" alt="Image 9" width="800" height="417"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Adding Prefix and Suffix Using Power Query
&lt;/h2&gt;

&lt;p&gt;Adding prefixes or suffixes to values standardises identifiers, helps distinguish keys across tables, and makes data more readable. Our Invoice_ID column already uses "INV-" prefixes — let's see how that's done and how to apply it to other columns.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Format → Add Prefix/Suffix (GUI)&lt;/strong&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;Select the column&lt;br&gt;
(e.g., Region_Key)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Transform tab → Format → Add Prefix&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Type the prefix, e.g., REG-. Result: 1 → REG-1, 10 → REG-10.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  You Now Have a Clean, Model-Ready Dataset
&lt;/h2&gt;

&lt;p&gt;Working through all these techniques on any dataset, you've transformed a collection of raw, messy CSVs into a structured, consistent, analysis-ready data model. Here's what was accomplished:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Loaded different tables and datasets &lt;/li&gt;
&lt;li&gt;Added index columns as surrogate keys for relationship management&lt;/li&gt;
&lt;li&gt;Created conditional columns to flag data quality issues and categorise data&lt;/li&gt;
&lt;li&gt;Unpivoted the wide Pivot Demo table into a proper long format&lt;/li&gt;
&lt;li&gt;Merged sales data with Region and many more datasets&lt;/li&gt;
&lt;li&gt;Appended 2019 and 2020 sales files into a unified table&lt;/li&gt;
&lt;li&gt;Extracted date parts from the Calendar table for time intelligence&lt;/li&gt;
&lt;li&gt;Identified and resolved 7 data quality issues in the booking dataset&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;With this foundation in Power Query, your DAX measures will be simpler, your reports faster, and your insights more reliable. Happy modelling!&lt;/p&gt;

</description>
      <category>datatransformation</category>
      <category>powerbi</category>
      <category>tutorial</category>
      <category>powerquery</category>
    </item>
    <item>
      <title>Getting Data from Multiple Sources in Power BI</title>
      <dc:creator>Bamgboye Simisola</dc:creator>
      <pubDate>Sat, 04 Apr 2026 00:31:26 +0000</pubDate>
      <link>https://forem.com/sims__/getting-data-from-multiple-sources-in-power-bi-pa1</link>
      <guid>https://forem.com/sims__/getting-data-from-multiple-sources-in-power-bi-pa1</guid>
      <description>&lt;h2&gt;
  
  
  &lt;strong&gt;Introduction&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;Let’s be honest, Power BI dashboards can look really pretty. But if the data behind them is messy, incomplete, or just plain confusing, then congratulations… you’ve built a very attractive lie.&lt;/p&gt;

&lt;p&gt;At the heart of every solid Power BI report is one thing: good data coming in the right way.&lt;/p&gt;

&lt;p&gt;In the real world, your data is never sitting nicely in one place waiting for you. Nope. It’s scattered everywhere, Excel files from one department, CSVs from another, a database somewhere, maybe even a random PDF someone swears is “the source of truth.”&lt;/p&gt;

&lt;p&gt;This is where Power BI earns its paycheck.&lt;/p&gt;

&lt;p&gt;With its Get Data feature and Power Query, you can pull in data from multiple sources, clean it up, and actually make sense of it, all in one place.&lt;/p&gt;

&lt;p&gt;In this guide, we’ll walk through how to:&lt;/p&gt;

&lt;p&gt;Connect Power BI to different types of data sources without stress&lt;br&gt;
Use Power Query to preview and understand what you’re working with&lt;br&gt;
Catch data issues early (before they embarrass you later)&lt;br&gt;
Set up a clean foundation for proper analysis and reporting. &lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;Architecture Overview&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;Before we start clicking buttons, let’s quickly understand what’s going on behind the scenes.&lt;/p&gt;

&lt;p&gt;Think of Power BI as the central hub where all your scattered data finally comes together to behave.&lt;/p&gt;

&lt;p&gt;Here’s the simple breakdown:&lt;/p&gt;

&lt;p&gt;Power BI Desktop → where you build your reports and models&lt;br&gt;
Data Sources → where your data lives (and misbehaves), such as:&lt;br&gt;
Excel and CSV files&lt;br&gt;
SQL databases&lt;br&gt;
JSON files and APIs&lt;br&gt;
PDFs (yes, even those stubborn ones)&lt;br&gt;
SharePoint folders&lt;/p&gt;

&lt;p&gt;All this data flows into Power Query, which is basically your “data cleaning assistant.”&lt;/p&gt;

&lt;p&gt;This is where you:&lt;/p&gt;

&lt;p&gt;Preview your data&lt;br&gt;
Fix errors&lt;br&gt;
Transform messy columns&lt;br&gt;
And make everything analysis-ready&lt;/p&gt;

&lt;p&gt;Only after that does the data get loaded into your model, where the real magic (and dashboards) happen.&lt;/p&gt;

&lt;p&gt;Before we start clicking buttons, let’s quickly understand what’s going on behind the scenes.&lt;/p&gt;

&lt;p&gt;Think of Power BI as the central hub where all your scattered data finally comes together to behave.&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;Connecting Data from Multiple Sources&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;Now to the real work, actually getting the data into Power BI.&lt;/p&gt;

&lt;p&gt;Power BI connects to many data sources, which is great… until you realise you might need to connect to all of them in a single project. Don’t worry, once you understand the pattern, it becomes pretty straightforward.&lt;/p&gt;

&lt;p&gt;Let’s walk through the common ones you’ll definitely run into:&lt;/p&gt;

&lt;h3&gt;
  
  
  Step 1: Connecting to Excel
&lt;/h3&gt;

&lt;p&gt;This is usually where everyone starts nice, familiar, and (mostly) well-behaved.&lt;/p&gt;

&lt;p&gt;Open Power BI Desktop&lt;br&gt;
Go to Home → Get Data → Excel&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fsu7aes853r5mfuuazsna.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fsu7aes853r5mfuuazsna.png" alt="Image 1" width="800" height="426"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Select your Excel file&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F6p6jngz0pqeg0sjq0e71.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F6p6jngz0pqeg0sjq0e71.png" alt="Image 2" width="800" height="351"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;In the Navigator, choose the sheet or table you need&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fm52pj7wbsfj9yd7kek1q.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fm52pj7wbsfj9yd7kek1q.png" alt="Image 3" width="800" height="442"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Click Load or Transform Data&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fgdbpv4a895bw9metv803.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fgdbpv4a895bw9metv803.png" alt="Image 4" width="800" height="442"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;If the Excel file is messy (and it usually is), just go straight to Transform Data and fix it before loading. Save yourself future stress.&lt;/p&gt;

&lt;h3&gt;
  
  
  Step 2: Connecting to Text/CSV Files
&lt;/h3&gt;

&lt;p&gt;CSV files look simple… until you open them and everything is in one column.&lt;/p&gt;

&lt;p&gt;Go to Home → Get Data → Text/CSV&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fd77buwp5fk3n3m5gn1pf.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fd77buwp5fk3n3m5gn1pf.png" alt="Image 5" width="800" height="404"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Select your file&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F85r2jg5hto7pk5n2e7ss.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F85r2jg5hto7pk5n2e7ss.png" alt="Image 6" width="800" height="329"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Preview the data&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F9jo2h7rug25yeao34ets.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F9jo2h7rug25yeao34ets.png" alt="Image 7" width="800" height="453"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Click Load or Transform Data&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fmx5rerjjrusa7cc3u74l.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fmx5rerjjrusa7cc3u74l.png" alt="Image 8" width="800" height="453"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Always preview properly here—wrong delimiters can ruin your day.&lt;/p&gt;

&lt;h3&gt;
  
  
  Step 3: Connecting to PDF
&lt;/h3&gt;

&lt;p&gt;Yes, Power BI can pull tables from PDFs. And yes, it feels a bit like magic.&lt;/p&gt;

&lt;p&gt;Go to Home → Get Data → PDF&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fq43j12bu8ncvurodn1n4.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fq43j12bu8ncvurodn1n4.png" alt="Image 9" width="800" height="490"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Select your file&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fa2ic6v8mfnfa5ze3bqg7.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fa2ic6v8mfnfa5ze3bqg7.png" alt="Image 10" width="800" height="343"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Choose what you need&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fqs5rtj775miwm5tqycj7.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fqs5rtj775miwm5tqycj7.png" alt="Image 11" width="800" height="478"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Click Load or Transform Data&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fvdl7o6v73dc461u7sofh.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fvdl7o6v73dc461u7sofh.png" alt="Image 12" width="800" height="478"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Just a heads-up: not all PDFs behave nicely, so expect to do some cleaning.&lt;/p&gt;

&lt;h3&gt;
  
  
  Step 4: Connecting to JSON
&lt;/h3&gt;

&lt;p&gt;JSON is common when working with APIs, and it can look… intimidating at first.&lt;/p&gt;

&lt;p&gt;Go to Home → Get Data → JSON&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ftwks9s8dwln1xb4pr0bp.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ftwks9s8dwln1xb4pr0bp.png" alt="Image 13" width="800" height="456"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Select your file or API endpoint&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F6da3d933foynyffcha9u.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F6da3d933foynyffcha9u.png" alt="Image 14" width="800" height="494"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Load into Power Query&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F4prth7200g5f6x1kofbq.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F4prth7200g5f6x1kofbq.png" alt="Image 15" width="800" height="391"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Expand nested fields to make the data readable&lt;br&gt;
Click Close &amp;amp; Apply&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fcqlt4zyf4kx69hk8jdcb.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fcqlt4zyf4kx69hk8jdcb.png" alt="Image 16" width="800" height="391"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The key here is mastering the “expand” feature—otherwise, you’ll just be staring at records inside records forever.&lt;/p&gt;

&lt;h3&gt;
  
  
  Step 5: Connecting to SharePoint Folder
&lt;/h3&gt;

&lt;p&gt;Perfect for team environments where files live in the cloud.&lt;/p&gt;

&lt;p&gt;Go to Home → Get Data → SharePoint Folder&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fgv3uknkjy7n8nsqsyneb.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fgv3uknkjy7n8nsqsyneb.png" alt="Image 17" width="800" height="453"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Enter the SharePoint URL&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fah6iuqo7vic8zv7631zm.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fah6iuqo7vic8zv7631zm.png" alt="Image 18" width="800" height="312"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Authenticate if needed&lt;/p&gt;

&lt;p&gt;Select your files&lt;br&gt;
Click Combine &amp;amp; Transform Data&lt;/p&gt;

&lt;p&gt;This is super useful when files are updated regularly—you don’t have to reconnect every time.&lt;/p&gt;

&lt;h3&gt;
  
  
  Step 6: Connecting to MySQL Database
&lt;/h3&gt;

&lt;p&gt;Now we’re stepping into database territory.&lt;/p&gt;

&lt;p&gt;Go to Home → Get Data → MySQL Database&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fmogbtzi8587pzbkoyrvs.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fmogbtzi8587pzbkoyrvs.png" alt="Image 21" width="800" height="495"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Enter server and database details&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Faqarhx0mjykfxo0cb4yw.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Faqarhx0mjykfxo0cb4yw.png" alt="Image 22" width="800" height="398"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Provide credentials&lt;br&gt;
Select the tables you need&lt;br&gt;
Click Load or Transform Data&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F09xjfvfuts1855h7cd5i.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F09xjfvfuts1855h7cd5i.png" alt="Image 23" width="800" height="492"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;At this point, you’re not just importing data—you’re choosing what actually matters.&lt;/p&gt;

&lt;h3&gt;
  
  
  Step 7: Connecting to SQL Server
&lt;/h3&gt;

&lt;p&gt;Very similar to MySQL, just a bit more common in enterprise setups.&lt;/p&gt;

&lt;p&gt;Go to Home → Get Data → SQL Server&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fo22dcvakyoiozb5h35jp.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fo22dcvakyoiozb5h35jp.png" alt="Image 24" width="800" height="427"&gt;&lt;/a&gt;&lt;br&gt;
Enter the server name&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Faqarhx0mjykfxo0cb4yw.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Faqarhx0mjykfxo0cb4yw.png" alt="Image 22" width="800" height="398"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Choose authentication&lt;/p&gt;

&lt;p&gt;Select your database and tables&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F8cxoqoak50sl2sz8xyxh.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F8cxoqoak50sl2sz8xyxh.png" alt="Image 25" width="800" height="431"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Click Transform Data&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F09xjfvfuts1855h7cd5i.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F09xjfvfuts1855h7cd5i.png" alt="Image 23" width="800" height="492"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;This is where your SQL knowledge really starts to shine, especially if you decide to write queries instead of loading full tables.&lt;/p&gt;

&lt;h3&gt;
  
  
  Step 8: Connecting to Web Data
&lt;/h3&gt;

&lt;p&gt;For pulling data directly from websites or APIs.&lt;/p&gt;

&lt;p&gt;Go to Home → Get Data → Web&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fnelkpy5kj351kwba73on.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fnelkpy5kj351kwba73on.png" alt="Image 26" width="800" height="459"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Enter the URL&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F9b09rtjboame3lxypbop.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F9b09rtjboame3lxypbop.png" alt="Image 27" width="800" height="385"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Select the detected data&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fp7flfl2sihzscwe06t09.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fp7flfl2sihzscwe06t09.png" alt="Image 28" width="800" height="384"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Click Load or Transform Data&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fx0yzi3gd036347khj6a7.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fx0yzi3gd036347khj6a7.png" alt="Image 29" width="800" height="490"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Very useful, but also where things can break easily if the source structure changes.&lt;/p&gt;

&lt;h3&gt;
  
  
  Step 9: Connecting to Azure Analysis Services
&lt;/h3&gt;

&lt;p&gt;This is more on the advanced/enterprise side.&lt;/p&gt;

&lt;p&gt;Go to Home → Get Data → Azure → Azure Analysis Services&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fgouy5njv2etifv0mv841.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fgouy5njv2etifv0mv841.png" alt="Image 19" width="800" height="479"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Enter the server&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Frha10mfrr6y5mob6z8sy.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Frha10mfrr6y5mob6z8sy.png" alt="Image 20" width="800" height="356"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Select your model&lt;br&gt;
Choose Live Connection&lt;br&gt;
Click Connect&lt;/p&gt;

&lt;p&gt;Here, you’re not importing data, you’re connecting directly to an existing model.&lt;/p&gt;

&lt;p&gt;If you’re noticing a pattern, you’re right:&lt;br&gt;
Connect → Preview → Transform → Load&lt;/p&gt;

&lt;p&gt;Once you get comfortable with that flow, switching between data sources becomes second nature.&lt;/p&gt;

&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;Connecting to multiple data sources in Power BI isn’t just a setup step, it’s where everything begins.&lt;/p&gt;

&lt;p&gt;Because the truth is, your dashboard is only as good as the data behind it. And in real-life scenarios, that data is coming from different places, in different formats, and sometimes in very questionable conditions.&lt;/p&gt;

&lt;p&gt;Power BI makes this process manageable, especially with Power Query acting as your cleanup zone. It gives you the chance to actually understand your data before jumping into visuals.&lt;/p&gt;

&lt;p&gt;But here’s the important part:&lt;br&gt;
connecting data is easy; preparing it properly is where the real skill is.&lt;/p&gt;

&lt;p&gt;When you take the time to:&lt;/p&gt;

&lt;p&gt;catch inconsistencies early&lt;br&gt;
handle missing or messy values&lt;br&gt;
and shape your data properly&lt;/p&gt;

&lt;p&gt;you end up with reports that people can actually trust.&lt;/p&gt;

&lt;p&gt;And that’s the goal, not just pretty dashboards, but reliable insights.&lt;/p&gt;

&lt;p&gt;At the end of the day, good analysis doesn’t start with charts.&lt;br&gt;
It starts with how well you bring your data together in the first place.&lt;/p&gt;

</description>
      <category>analytics</category>
      <category>data</category>
      <category>dataengineering</category>
      <category>tutorial</category>
    </item>
  </channel>
</rss>
