<?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>DEV Community: Felix Ng'ang'a</title>
    <description>The latest articles on DEV Community by Felix Ng'ang'a (@whiteballs).</description>
    <link>https://dev.to/whiteballs</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.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3952261%2Fcad6bbcf-7bba-49c2-a24b-857b1e95c89a.png</url>
      <title>DEV Community: Felix Ng'ang'a</title>
      <link>https://dev.to/whiteballs</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/whiteballs"/>
    <language>en</language>
    <item>
      <title>Power BI Relationships &amp; Joins: Why Your Tables Need to Be On Speaking Terms</title>
      <dc:creator>Felix Ng'ang'a</dc:creator>
      <pubDate>Fri, 03 Jul 2026 12:22:54 +0000</pubDate>
      <link>https://dev.to/whiteballs/power-bi-relationships-joins-why-your-tables-need-to-be-on-speaking-terms-26c8</link>
      <guid>https://dev.to/whiteballs/power-bi-relationships-joins-why-your-tables-need-to-be-on-speaking-terms-26c8</guid>
      <description>&lt;h2&gt;
  
  
  Power BI Relationships &amp;amp; Joins: Why Your Tables Need to Be On Speaking Terms
&lt;/h2&gt;

&lt;p&gt;Picture this: you walk into a wedding. The seating chart says Table 7. Your name card is there, but somehow it's sitting next to people you've never met, at a table meant for the groom's college friends, while your actual friends are three tables away wondering where you went.&lt;/p&gt;

&lt;p&gt;That's what a Power BI report looks like when your relationships are wrong. The data isn't lying to you it's just sitting at the wrong table.&lt;/p&gt;

&lt;p&gt;If you've ever built a report where the numbers looked &lt;em&gt;almost&lt;/em&gt; right, or a slicer that refused to filter a visual no matter how hard you clicked it, you've met this problem before. Let's actually fix it, and understand why it happens.&lt;/p&gt;

&lt;h3&gt;
  
  
  Your Tables Are Strangers Until You Introduce Them
&lt;/h3&gt;

&lt;p&gt;When you load data into Power BI from a sales system, a CRM, and a spreadsheet someone's been maintaining since 2019, you don't get one big blob of information. You get several separate tables, like guests arriving from different families who've never met.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;Sales&lt;/code&gt; — knows what got sold, when, and how much&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;Products&lt;/code&gt; — knows what the products actually are&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;Customers&lt;/code&gt; — knows who bought them&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;Calendar&lt;/code&gt; — knows what a "quarter" even means&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Power BI doesn't automatically know that the &lt;code&gt;ProductID&lt;/code&gt; in your &lt;code&gt;Sales&lt;/code&gt; table refers to the same product as the &lt;code&gt;ProductID&lt;/code&gt; in your &lt;code&gt;Products&lt;/code&gt; table. You have to introduce them. That introduction is a &lt;strong&gt;relationship&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Think of a relationship like exchanging phone numbers at that wedding. Once two tables have each other's number, they can pass messages back and forth specifically, filter context. Click on "Nairobi" in a &lt;code&gt;Customers&lt;/code&gt; slicer, and if the relationship exists, &lt;code&gt;Sales&lt;/code&gt; immediately knows to only show orders from Nairobi customers. No relationship, no phone number, no message gets through. The slicer clicks, nothing moves, and you're left refreshing the page wondering if the report is broken.&lt;/p&gt;

&lt;h3&gt;
  
  
  The Star Schema: Sitting Everyone at the Right Table
&lt;/h3&gt;

&lt;p&gt;Here's where the wedding analogy earns its keep. A well-run wedding doesn't seat every guest randomly there's a top table (the couple) and everyone else is arranged around it, each guest at exactly one table, with a clear line back to the center.&lt;/p&gt;

&lt;p&gt;That's a &lt;strong&gt;star schema&lt;/strong&gt;. One central table usually your &lt;code&gt;Sales&lt;/code&gt; or &lt;code&gt;Transactions&lt;/code&gt; table, packed with numbers you want to measure (revenue, quantity, discount) surrounded by smaller tables that describe &lt;em&gt;who, what, where, and when&lt;/em&gt;. Draw it out and it genuinely looks like a star, with &lt;code&gt;Sales&lt;/code&gt; at the middle and &lt;code&gt;Customers&lt;/code&gt;, &lt;code&gt;Products&lt;/code&gt;, &lt;code&gt;Calendar&lt;/code&gt;, and &lt;code&gt;Stores&lt;/code&gt; radiating outward.&lt;/p&gt;

&lt;p&gt;The alternative a &lt;strong&gt;snowflake schema&lt;/strong&gt; is what happens when your seating chart gets fancy: &lt;code&gt;Products&lt;/code&gt; connects to &lt;code&gt;Subcategory&lt;/code&gt;, which connects to &lt;code&gt;Category&lt;/code&gt;, which connects to &lt;code&gt;Department&lt;/code&gt;. Technically organized, but now a simple question like "what's our furniture revenue?" has to travel through three tables to get an answer. It works, but it's slower to reason about and slower for Power BI's engine to chew through.&lt;/p&gt;

&lt;p&gt;Most of the time, star beats snowflake. Simpler paths, faster performance, and importantly you can actually explain it to your manager without a whiteboard meltdown.&lt;/p&gt;

&lt;h3&gt;
  
  
  One-to-Many: The Manager and the Team
&lt;/h3&gt;

&lt;p&gt;The most common relationship you'll build is &lt;strong&gt;one-to-many&lt;/strong&gt;. Think of it like one manager overseeing many employees. In &lt;code&gt;Customers&lt;/code&gt;, "Amina" appears exactly once she's a single row, a single person. In &lt;code&gt;Sales&lt;/code&gt;, "Amina" might appear fifty times, once for every order she's ever placed.&lt;/p&gt;

&lt;p&gt;That's the shape: &lt;strong&gt;one&lt;/strong&gt; row in &lt;code&gt;Customers&lt;/code&gt; connects to &lt;strong&gt;many&lt;/strong&gt; rows in &lt;code&gt;Sales&lt;/code&gt;. This is by far the most common relationship in Power BI, and it's the one the star schema is built on. &lt;code&gt;Products&lt;/code&gt; has one row per product; &lt;code&gt;Sales&lt;/code&gt; has many rows referencing that product. &lt;code&gt;Calendar&lt;/code&gt; has one row per date; &lt;code&gt;Sales&lt;/code&gt; has many transactions on that date.&lt;/p&gt;

&lt;p&gt;The direction of the arrow matters too filters generally flow from the "one" side to the "many" side. Amina's customer record can filter her orders.&lt;/p&gt;

&lt;h3&gt;
  
  
  Many-to-Many: When Everyone Knows Everyone
&lt;/h3&gt;

&lt;p&gt;Sometimes there's no single "one" side. Imagine a group of friends carpooling to that wedding several people can ride in several different cars, and no car belongs to just one person. That's &lt;strong&gt;many-to-many&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;In Power BI, this shows up when, say, a &lt;code&gt;Promotions&lt;/code&gt; table lists discount codes, and a single sale can involve multiple promotions, while a single promotion can apply to multiple sales. Neither side is uniquely one thing. Power BI can handle this, but it's the seating arrangement most likely to cause a headache ambiguous filtering, duplicated values, numbers that look inflated. Use it when you genuinely need it, but don't reach for it as your default; it's the wedding-planning equivalent of "let's just let everyone sit wherever."&lt;/p&gt;

&lt;h3&gt;
  
  
  Joins: How the Introduction Actually Happens
&lt;/h3&gt;

&lt;p&gt;If a relationship is the phone-number exchange, a &lt;strong&gt;join&lt;/strong&gt; is the actual conversation the moment Power BI's engine physically combines rows from two tables based on a matching column, usually during Power Query transformations rather than the report canvas itself.&lt;/p&gt;

&lt;p&gt;Say you're merging a &lt;code&gt;Sales&lt;/code&gt; table with a &lt;code&gt;Returns&lt;/code&gt; table. You've got choices for how to handle guests who show up on one list but not the other:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Inner Join&lt;/strong&gt; — only the sales that also appear in returns. Only guests whose names appear on &lt;em&gt;both&lt;/em&gt; the bride's list and the groom's list get a seat. Strict, but sometimes too strict — you lose everyone else.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Left Outer Join&lt;/strong&gt; — every sale, plus matching return info where it exists. Every guest the bride invited gets a seat; if they also happen to be on the groom's list, great, extra details get attached, but nobody from her list gets left out.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Right Outer Join&lt;/strong&gt; — the mirror image: every return, plus matching sales where they exist.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Full Outer Join&lt;/strong&gt; — everyone from both lists, matched where possible, with blanks where there's no match on the other side. Nobody gets turned away, even if some details are missing.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Anti Joins&lt;/strong&gt; (left/right) — the interesting one for troubleshooting: show me sales that have &lt;em&gt;no&lt;/em&gt; matching return. This is how you'd find, say, every guest who RSVP'd but was mysteriously left off the actual seating chart great for finding orphaned records, orders with no customer match, or products that were sold but never appear in your master product list.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;In Power Query, you'll do this through the &lt;strong&gt;Merge Queries&lt;/strong&gt; dialog, picking your two tables, the matching column, and the join type from a dropdown. It looks unassuming for something that decides whether your final row count is 10,000 or 47.&lt;/p&gt;

&lt;h3&gt;
  
  
  Why This All Actually Matters
&lt;/h3&gt;

&lt;p&gt;Here's the part that turns this from trivia into something worth caring about: a report can be &lt;em&gt;visually&lt;/em&gt; perfect clean colors, tidy cards, a nice looking donut chart and still be quietly wrong underneath, because a relationship was set to many-to-many by accident, or a join duplicated every row three times, or a filter direction was pointing the wrong way.&lt;/p&gt;

&lt;p&gt;Nobody claps when your relationships are correct. But everybody notices when the total revenue on your dashboard doesn't match the total revenue in the CFO's spreadsheet. That mismatch is almost never a "Power BI bug." It's a seating chart problem.&lt;/p&gt;

&lt;h3&gt;
  
  
  The Takeaway
&lt;/h3&gt;

&lt;p&gt;Relationships tell your tables who's related to whom. Joins are the mechanics of actually stitching that data together. Get the shape right star schema where you can, one-to-many as your default, many-to-many only when you truly need it and the rest of your report, the DAX measures, the slicers, the drill throughs, all of it starts behaving the way you'd expect.&lt;/p&gt;

&lt;p&gt;Next time a visual in your report looks off, don't start by rewriting your measure. Go check the seating chart first.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;If you've run into a Power BI relationship horror story duplicated rows, phantom totals, a many-to-many you didn't mean to create drop it in the comments. Misery loves company, and so does debugging.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>powerbi</category>
    </item>
    <item>
      <title>EXCEL IN DATA ANALYSIS</title>
      <dc:creator>Felix Ng'ang'a</dc:creator>
      <pubDate>Sat, 06 Jun 2026 14:56:01 +0000</pubDate>
      <link>https://dev.to/whiteballs/excel-in-data-analysis-2pel</link>
      <guid>https://dev.to/whiteballs/excel-in-data-analysis-2pel</guid>
      <description>&lt;p&gt;Excel is a Microsoft application program which incorporates spreadsheets to store, organize, manipulate, and analyze data. It has workbooks and worksheets, whereby in each workbook you have multiple pages called worksheets. On the worksheet there is a grid which contains rows, columns, and cells. The columns run vertically and are labeled with letters. Rows run horizontally and are labeled with numbers. Cells are individual boxes where rows and columns intersect, and each cell has a unique address.&lt;/p&gt;

&lt;p&gt;Excel can be categorized into three pillars: data entry and organization, calculations, and visualization and analysis. In data entry, cells can hold information like text, numbers, dates, and percentages. It allows you to make this data readable. For example, functions and formulas: a function is a predefined calculation like SUM or AVERAGE that takes input values, whereas a formula is a complete expression that uses functions, references, and operators to perform calculations in a cell. Excel helps one interpret data by visualizing it into forms of charts and tables.&lt;/p&gt;

&lt;p&gt;In a data driven world, Excel is a powerful tool for real world data analysis across various industries and institutions. Financial institutions such as banks or investment firms use Excel for financial reporting, risk assessment, and portfolio valuation by integrating market data with investment metrics. Marketing strategists use Excel to measure campaign performance, customer trends, and return on investment. Even in smaller businesses, Excel helps track inventory, sales, and employee hours.&lt;/p&gt;

&lt;p&gt;Out of all the powerful features I have learned so far, Excel's best functions are conditional functions such as AVERAGEIF and COUNTIF. I realized this when my instructor gave us a dataset and asked two specific questions. First: "What is the average feedback score for Single Males?" Second: "What's the total bonus for employees earning above 100,000?" At first, I thought I would have to manually sort and filter, which would have taken forever. Then I used AVERAGEIF to calculate the average feedback score for only the rows where marital status was "Single" and gender was "Male." For the second question, I used SUMIF to add up bonuses only for employees whose salary was above 100,000. Within seconds, I had both answers. That was the moment I truly saw the potential of Excel. It wasn't just about typing in data anymore it was about asking the right questions and letting the functions do the heavy lifting.&lt;/p&gt;

&lt;p&gt;In conclusion, Excel has made me see the true potential of extracting information from data. Before that assignment, I thought Excel was just for making simple tables and basic addition. But after using AVERAGEIF and SUMIF on a real dataset, I understood what my instructor meant when he told us that data gives an opinion. You just have to know how to ask the right question. It has shown me the true value of data and what it can say when you know how to listen.&lt;/p&gt;

</description>
      <category>beginners</category>
      <category>data</category>
      <category>microsoft</category>
      <category>productivity</category>
    </item>
  </channel>
</rss>
