<?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: Joan</title>
    <description>The latest articles on DEV Community by Joan (@joan_ae8a2f2d1918a74de9a3).</description>
    <link>https://dev.to/joan_ae8a2f2d1918a74de9a3</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%2F3963148%2F32fda4d9-da9d-4c7c-9e3b-bba4532f12e4.png</url>
      <title>DEV Community: Joan</title>
      <link>https://dev.to/joan_ae8a2f2d1918a74de9a3</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/joan_ae8a2f2d1918a74de9a3"/>
    <language>en</language>
    <item>
      <title>The Leading Zero Taught Me More</title>
      <dc:creator>Joan</dc:creator>
      <pubDate>Mon, 20 Jul 2026 11:55:10 +0000</pubDate>
      <link>https://dev.to/joan_ae8a2f2d1918a74de9a3/the-leading-zero-taught-me-more-3c23</link>
      <guid>https://dev.to/joan_ae8a2f2d1918a74de9a3/the-leading-zero-taught-me-more-3c23</guid>
      <description>&lt;p&gt;&lt;em&gt;My SQL learning log; from "why is my zero gone" to joining four tables without blinking&lt;/em&gt;&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fsfwf20iv6lx4vbx3v0l1.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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fsfwf20iv6lx4vbx3v0l1.png" alt=" " width="680" height="680"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;A few weeks ago, I ran a simple query:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;SELECT * FROM customers;&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;And stared at this:&lt;br&gt;
711223344&lt;br&gt;
That's not a typo; that's supposed to be 0711223344, a normal Kenyan phone number. SQL had quietly eaten the zero.&lt;/p&gt;

&lt;p&gt;No error. No warning. Just... gone.&lt;/p&gt;

&lt;p&gt;That one broken row taught me more about how SQL actually thinks than any tutorial had up to that point. So instead of writing another "here's what INNER JOIN means" post, I want to walk through the actual bugs that took me from green to dangerous in SQL, because that's genuinely how I learned. &lt;br&gt;
Not from reading theory. From building real tables, breaking them, and going "wait, why."&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Stage 1: Data types are not a formality&lt;/strong&gt;&lt;br&gt;
Turns out my phone_number column was numeric. And numbers don't have leading zeros; mathematically, 0711223344 and 711223344 are the same number, so SQL "helpfully" dropped it.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Lesson&lt;/strong&gt;: phone numbers are not numbers. They're identifiers. Same goes for anything that might have leading zeros, + signs, dashes, or extensions.&lt;br&gt;
 &lt;strong&gt;Wrong&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="n"&gt;phone_number&lt;/span&gt; &lt;span class="nb"&gt;INT&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Right&lt;/strong&gt;&lt;br&gt;
&lt;code&gt;phone_number VARCHAR(15)&lt;/code&gt; &lt;br&gt;
This bug is also where I learned to tell the difference between a real data problem and my SQL client just displaying something weird.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Stage 2: Quote your strings, or SQL goes looking for a table called "Amina"&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Next wall: I wrote inserts like this—&lt;br&gt;
&lt;code&gt;VALUES (1, Amina, Wanjiku, F, 2008-03-12, Form3, Nairobi)&lt;/code&gt;&lt;br&gt;
and got:&lt;br&gt;
ERROR: column "amina" does not exist&lt;/p&gt;

&lt;p&gt;Without quotes, SQL doesn't see a value; it sees what it thinks is a column or table name, and goes hunting for it.&lt;br&gt;
&lt;strong&gt;Wrong&lt;/strong&gt;&lt;br&gt;
&lt;code&gt;VALUES (1, Amina, Wanjiku, F, 2008-03-12, Form3, Nairobi)&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Right&lt;/strong&gt;&lt;br&gt;
&lt;code&gt;VALUES (1, 'Amina', 'Wanjiku', 'F', '2008-03-12', 'Form3', 'Nairobi')&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Rule that stuck: numbers don't need quotes. Text and dates always do. And a single unclosed quote ('Charlie), instead of 'Charlie'), doesn't just break one value; it can swallow everything after it into one garbled string.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Stage 3: Constraints are guardrails, not decoration&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Once the basics worked, I started actually leaning on constraints instead of just adding them.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="k"&gt;CREATE&lt;/span&gt; &lt;span class="k"&gt;TABLE&lt;/span&gt; &lt;span class="n"&gt;products&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;product_id&lt;/span&gt;   &lt;span class="nb"&gt;SERIAL&lt;/span&gt; &lt;span class="k"&gt;PRIMARY&lt;/span&gt; &lt;span class="k"&gt;KEY&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;product_name&lt;/span&gt; &lt;span class="nb"&gt;VARCHAR&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;150&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;NOT&lt;/span&gt; &lt;span class="k"&gt;NULL&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;unit_price&lt;/span&gt;   &lt;span class="nb"&gt;NUMERIC&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;NOT&lt;/span&gt; &lt;span class="k"&gt;NULL&lt;/span&gt; &lt;span class="k"&gt;CHECK&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;unit_price&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
    &lt;span class="n"&gt;stock&lt;/span&gt;        &lt;span class="nb"&gt;INT&lt;/span&gt; &lt;span class="k"&gt;NOT&lt;/span&gt; &lt;span class="k"&gt;NULL&lt;/span&gt; &lt;span class="k"&gt;DEFAULT&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;
&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;CHECK stops bad prices at the door. DEFAULT means an incomplete insert still lands somewhere sensible. FOREIGN KEY means an order can never point at a customer that doesn't exist.&lt;/p&gt;

&lt;p&gt;That last one had a sting in the tail: I couldn't delete a cancelled order without Postgres blocking me, because order_items still had rows pointing at it.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Delete children first
&lt;code&gt;DELETE FROM order_items WHERE order_id = 4;
DELETE FROM orders WHERE order_id = 4;&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;New habit: before deleting anything, ask what still points at it.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Stage 4: WHERE clauses and their many wrong spellings&lt;/strong&gt;&lt;br&gt;
I went through a phase of getting close but not quite right:&lt;br&gt;
&lt;strong&gt;Nope&lt;/strong&gt;&lt;br&gt;
&lt;code&gt;WHERE unit_price =&amp;gt; 60, unit_price =&amp;lt; 200;&lt;br&gt;
&lt;/code&gt;&lt;br&gt;
&lt;strong&gt;Yep&lt;/strong&gt;&lt;br&gt;
&lt;code&gt;WHERE unit_price BETWEEN 60 AND 200;&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;SQL syntax doesn't do "close enough." But this is also where &lt;strong&gt;BETWEEN, IN, NOT IN, LIKE,&lt;/strong&gt; and &lt;strong&gt;ILIKE&lt;/strong&gt; stopped being abstract keywords and became daily tools, filtering exam scores by range, finding subjects containing "Studies," and learning the hard way that LIKE is case-sensitive in Postgres but ILIKE isn't&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Stage 5: GROUP BY ≠ ORDER BY (a genuinely humbling moment)&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;I once expected this,&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="k"&gt;SELECT&lt;/span&gt; &lt;span class="n"&gt;order_id&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;customer_id&lt;/span&gt;
&lt;span class="k"&gt;FROM&lt;/span&gt; &lt;span class="n"&gt;orders&lt;/span&gt;
&lt;span class="k"&gt;ORDER&lt;/span&gt; &lt;span class="k"&gt;BY&lt;/span&gt; &lt;span class="n"&gt;customer_id&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;to also sort order_id neatly. It doesn't. ORDER BY controls display order. It has nothing to do with grouping.&lt;br&gt;
**&lt;br&gt;
GROUP BY + HAVING **forced a real mental shift from "show me rows" to "collapse these rows into one answer per group, then filter the groups":&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="k"&gt;SELECT&lt;/span&gt; &lt;span class="n"&gt;customer_id&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="k"&gt;COUNT&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;AS&lt;/span&gt; &lt;span class="n"&gt;order_count&lt;/span&gt;
&lt;span class="k"&gt;FROM&lt;/span&gt; &lt;span class="n"&gt;orders&lt;/span&gt;
&lt;span class="k"&gt;GROUP&lt;/span&gt; &lt;span class="k"&gt;BY&lt;/span&gt; &lt;span class="n"&gt;customer_id&lt;/span&gt;
&lt;span class="k"&gt;HAVING&lt;/span&gt; &lt;span class="k"&gt;COUNT&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That was the moment aggregation actually clicked.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Stage 6: JOINs and knowing which one&lt;/strong&gt;&lt;br&gt;
Joining customers → orders → order_items → products into a single query was the milestone that finally made the relational model make sense. But the real lesson wasn't the syntax; it was INNER vs LEFT.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Only matched rows — perfect for totals
&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;
&lt;span class="k"&gt;SELECT&lt;/span&gt; &lt;span class="n"&gt;p&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;product_name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="k"&gt;SUM&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;oi&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;quantity&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;AS&lt;/span&gt; &lt;span class="n"&gt;total_sold&lt;/span&gt;
&lt;span class="k"&gt;FROM&lt;/span&gt; &lt;span class="n"&gt;order_items&lt;/span&gt; &lt;span class="n"&gt;oi&lt;/span&gt;
&lt;span class="k"&gt;INNER&lt;/span&gt; &lt;span class="k"&gt;JOIN&lt;/span&gt; &lt;span class="n"&gt;products&lt;/span&gt; &lt;span class="n"&gt;p&lt;/span&gt; &lt;span class="k"&gt;ON&lt;/span&gt; &lt;span class="n"&gt;oi&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;product_id&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;p&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;product_id&lt;/span&gt;
&lt;span class="k"&gt;GROUP&lt;/span&gt; &lt;span class="k"&gt;BY&lt;/span&gt; &lt;span class="n"&gt;p&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;product_name&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;Keeps orders even with zero items.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="k"&gt;SELECT&lt;/span&gt; &lt;span class="n"&gt;o&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;order_id&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;oi&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;quantity&lt;/span&gt;
&lt;span class="k"&gt;FROM&lt;/span&gt; &lt;span class="n"&gt;orders&lt;/span&gt; &lt;span class="n"&gt;o&lt;/span&gt;
&lt;span class="k"&gt;LEFT&lt;/span&gt; &lt;span class="k"&gt;JOIN&lt;/span&gt; &lt;span class="n"&gt;order_items&lt;/span&gt; &lt;span class="n"&gt;oi&lt;/span&gt; &lt;span class="k"&gt;ON&lt;/span&gt; &lt;span class="n"&gt;oi&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;order_id&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;o&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;order_id&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;An INNER JOIN only shows matches on both sides. A LEFT JOIN keeps every row on the left even when there's nothing on the right, filling the gap with NULL. That distinction is how I caught a cancelled order that had zero items attached, before deleting it broke a foreign key.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Stage 7: CASE WHEN — logic, not just filtering&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;My first CASE attempt had a bug I didn't see coming:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Always NULL; a column can't equal two things at once
&lt;code&gt;WHEN class = 'Form2' AND class = 'Form1' THEN 'Junior'&lt;/code&gt;
Fixed:
&lt;code&gt;WHEN class IN ('Form1', 'Form2') THEN 'Junior'
WHEN class IN ('Form3', 'Form4') THEN 'Senior'&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;By the time I was labelling exam results as 'Distinction', 'Merit', 'Pass', or 'Fail' based on marks, CASE WHEN had gone from confusing to intuitive:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="nv"&gt;`CASE
    WHEN marks &amp;gt;= 80 THEN 'Distinction'
    WHEN marks &amp;gt;= 60 THEN 'Merit'
    WHEN marks &amp;gt;= 40 THEN 'Pass'
    ELSE 'Fail'
END 
AS performance
FROM greenwood_academy.exam_results
ORDER BY result_id;`&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Where I am now&lt;/strong&gt;&lt;br&gt;
I can design a schema from scratch (tables, keys, constraints, sane defaults), populate it, break it, fix it, and query it with filters, aggregates, four-table joins, and conditional logic. But the bigger shift is how I read errors now:&lt;/p&gt;

&lt;p&gt;•Syntax error near WHEN? → missing comma before it.&lt;br&gt;
•Foreign key violation on delete? → something still references that row.&lt;br&gt;
•CASE returning NULL everywhere? → logic bug in the conditions, not a data problem.&lt;br&gt;
None of this came from memorising syntax. It came from building real tables: a shop's customers and orders, a school's students and exam results, breaking them in small, specific ways, and stubbornly asking "why."&lt;br&gt;
If you're early in SQL: don't chase the "correct" query on the first try. Build something real. Watch it fail. Read the error closely. That's genuinely where it sticks.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Currently deepening this into Power BI and data analysis work — if you're on a similar SQL-to-analytics path, I'd love to hear what tripped you up first.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>beginners</category>
      <category>sql</category>
      <category>postgres</category>
      <category>database</category>
    </item>
    <item>
      <title>Connecting Power BI to PostgreSQL: Local vs Cloud (Aiven)</title>
      <dc:creator>Joan</dc:creator>
      <pubDate>Sun, 05 Jul 2026 11:38:34 +0000</pubDate>
      <link>https://dev.to/joan_ae8a2f2d1918a74de9a3/connecting-power-bi-to-postgresql-local-vs-cloud-aiven-4alo</link>
      <guid>https://dev.to/joan_ae8a2f2d1918a74de9a3/connecting-power-bi-to-postgresql-local-vs-cloud-aiven-4alo</guid>
      <description>&lt;p&gt;If you've ever wondered how a Power BI dashboard gets its data from a "real" database instead of a spreadsheet, this walkthrough covers both ends of that journey: connecting to a local PostgreSQL database and connecting to a cloud-hosted PostgreSQL database on Aiven, including the SSL certificate step that trips a lot of people up.&lt;/p&gt;

&lt;p&gt;This was done as part of a data analytics project analyzing sales data for a car dealership (JCars Logistics), but the connection steps here apply to any dataset.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Connecting Power BI to a Local PostgreSQL Database&lt;/strong&gt;&lt;br&gt;
&lt;strong&gt;Step 1: Set up PostgreSQL locally and create the database in DBeaver&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Created a new connection in DBeaver pointing to localhost&lt;br&gt;
Created the database and table matching the dataset's schema&lt;br&gt;
Imported the Kenya_crops_dataset CSV file into the table using DBeaver's import tool&lt;br&gt;
Verified the data by querying it directly in DBeaver&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F6hr6vsfgrfsahg5bpt3g.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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F6hr6vsfgrfsahg5bpt3g.png" alt=" " width="557" height="494"&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fefnjgh4lgd2r6gtsgufc.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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fefnjgh4lgd2r6gtsgufc.png" alt=" " width="800" height="498"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Step 2: Connect from Power BI&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;With the database and data already set up via DBeaver, open Power BI Desktop:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Get Data → More → Database → PostgreSQL database&lt;/li&gt;
&lt;li&gt;Enter localhost:portnumber as the server, and your database name&lt;/li&gt;
&lt;li&gt;Choose Import or DirectQuery mode&lt;/li&gt;
&lt;li&gt;Enter your local database username and password&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fg0z1zmp8id7drili8d8u.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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fg0z1zmp8id7drili8d8u.png" alt=" " width="800" height="363"&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fbyjm3c4nidjp8nmzi69x.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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fbyjm3c4nidjp8nmzi69x.png" alt=" " width="800" height="374"&gt;&lt;/a&gt;&lt;br&gt;
&lt;strong&gt;Step 3: Load and verify&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Once connected, select your table(s) in the Navigator window and click Load. Power BI will pull the data in, and you can confirm row counts match what you saw in DBeaver.&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fz2fylty0q6qt7i73faxx.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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fz2fylty0q6qt7i73faxx.png" alt=" " width="479" height="304"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;That's the local setup, straightforward because there's no network encryption to configure. The cloud version adds one extra layer: SSL.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Part 2: Connecting Power BI to a Cloud PostgreSQL Database (Aiven)&lt;/strong&gt;&lt;br&gt;
&lt;strong&gt;Step 1: Create a PostgreSQL service on Aiven&lt;/strong&gt;&lt;br&gt;
Log into Aiven, create a new PostgreSQL service, and wait for it to provision. Aiven gives you a host, port, username, password, and database name, plus a downloadable SSL certificate (ca.pem), since Aiven requires encrypted connections by default&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fj91kn4uz5q179heoz3jz.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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fj91kn4uz5q179heoz3jz.png" alt=" " width="800" height="96"&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fjy6uwzvqxkwavm0zf742.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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fjy6uwzvqxkwavm0zf742.png" alt=" " width="799" height="419"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Step 2: Load your data into the Aiven database&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Rather than connecting Power BI directly for data loading, I used DBeaver as a SQL client to manage the database and import data:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Created a new connection in DBeaver using the Aiven host, port, username, and password.
&lt;strong&gt;Make sure to test the connection first&lt;/strong&gt;.

&lt;ul&gt;
&lt;li&gt;Created a table matching my dataset's schema&lt;/li&gt;
&lt;li&gt;Imported the Jcars.CSV file directly into the table using DBeaver's import tool&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Verified the data by querying it directly in DBeaver&lt;/li&gt;
&lt;/ul&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fl89oz3ncqzjt9ty90s41.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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fl89oz3ncqzjt9ty90s41.png" alt=" " width="800" height="437"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Step 3: Install the SSL certificate&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;This is the step that's easy to get wrong. Rather than pointing every application separately at the ca.pem file, I installed it once at the operating system level:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Downloaded ca.pem from the Aiven console&lt;/li&gt;
&lt;li&gt;Opened Manage User Certificates (Windows) → Trusted Root Certification Authorities&lt;/li&gt;
&lt;li&gt;Imported the ca.pem file there&lt;/li&gt;
&lt;/ul&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F6xlj7217uv2g3nf72ivf.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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F6xlj7217uv2g3nf72ivf.png" alt=" " width="745" height="783"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Once installed this way, any application on the machine — including Power BI trusts and verifies the certificate automatically, without needing to browse to the file each time.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Step 4: Connect Power BI to Aiven&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Get Data → PostgreSQL database&lt;/li&gt;
&lt;li&gt;Enter the Aiven host and port (not localhost this time)&lt;/li&gt;
&lt;li&gt;Enter the database name&lt;/li&gt;
&lt;li&gt;Enable the encrypted connection option, since the certificate is already trusted at the OS level; Power BI verifies it automatically&lt;/li&gt;
&lt;li&gt;Authenticate with your Aiven username and password&lt;/li&gt;
&lt;li&gt;Select your table(s) in the Navigator and click Load or Transform.&lt;/li&gt;
&lt;/ul&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F95u8fx4bd93pb72lprxh.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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F95u8fx4bd93pb72lprxh.png" alt=" " width="800" height="376"&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F7ltaqa2i3v8mkz78x0bs.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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F7ltaqa2i3v8mkz78x0bs.png" alt=" " width="517" height="484"&gt;&lt;/a&gt;&lt;br&gt;
&lt;strong&gt;Local vs Cloud: What's Actually Different&lt;/strong&gt;&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F8uvz4coilsw0pu81by38.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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F8uvz4coilsw0pu81by38.png" alt=" " width="798" height="108"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The actual Power BI connection dialog is nearly identical either way; the real difference is the SSL certificate step for the cloud database, and once that's installed at the OS level, it's a one-time setup rather than something you repeat per connection.&lt;/p&gt;

&lt;p&gt;Once the data was loaded, I built a Power BI dashboard to analyze revenue, gross profit margin, and delivery performance for JCars Logistics. The main takeaway from this part: connecting Power BI to a cloud database isn't meaningfully harder than a local one; it just adds one certificate step that only needs to be done once.&lt;/p&gt;

</description>
    </item>
    <item>
      <title>Power BI Data Modeling: Schemas, Relationships, Joins, and Why They All Matter explanations</title>
      <dc:creator>Joan</dc:creator>
      <pubDate>Wed, 24 Jun 2026 13:45:00 +0000</pubDate>
      <link>https://dev.to/joan_ae8a2f2d1918a74de9a3/power-bi-data-modeling-schemas-relationships-joins-and-why-they-all-matter-explanations-503c</link>
      <guid>https://dev.to/joan_ae8a2f2d1918a74de9a3/power-bi-data-modeling-schemas-relationships-joins-and-why-they-all-matter-explanations-503c</guid>
      <description>&lt;p&gt;Here’s what I’ve learnt about Power BI: creating visuals is the easy bit. What truly determines your dashboard’s success happens long before you drag your first chart onto the canvas; it’s all about how you design your data model.&lt;/p&gt;

&lt;p&gt;If your model isn’t set up correctly, your numbers can be inaccurate in ways that are tough to diagnose. Let’s break it down from the ground up so we can get it right from the start.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What Is Data Modeling?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Data modeling means organizing your tables so Power BI understands how they connect. Before you build any visuals, it’s essential to define which tables relate to each other, how they’re linked, and the direction filters should flow.&lt;/p&gt;

&lt;p&gt;Think of it like organising your desk before you start working. If everything is in the right place, the work goes smoothly. If it is not, you spend the whole session looking for things.&lt;/p&gt;

&lt;p&gt;A good model is accurate and easy to maintain. A poor one leads to confusing errors. In Power BI, you’ll mainly use two table layouts:&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fegxqnrhybms0jflpl5db.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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fegxqnrhybms0jflpl5db.png" alt=" " width="736" height="460"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;-&lt;strong&gt;Star Schema&lt;/strong&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This is Power BI’s standard. Puts your main fact table in the center, with dimension tables around it (shaped like a star).&lt;br&gt;
Power BI works best with a star schema—filters and calculations are simple, and performance is fast. When unsure, use this structure.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Snowflake Schema&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;A snowflake schema takes the star schema and breaks down dimension tables further into sub-tables. This adds complexity and usually slows things down in Power BI.&lt;br&gt;
If your source uses a snowflake schema, try to flatten it into a star schema in Power BI before modeling.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Relationships — How Tables Talk to Each Other&lt;/strong&gt;&lt;br&gt;
A relationship is the link between two tables, defined by a shared column, usually an ID field. In Power BI, you set these up in the Model view, and there are three things to understand about every relationship you create:&lt;/p&gt;

&lt;p&gt;1.&lt;strong&gt;Cardinality — the ratio between the two tables&lt;/strong&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fri4fscvl76zik2l2znw0.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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fri4fscvl76zik2l2znw0.png" alt=" " width="736" height="1104"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;-One-to-Many (most common): one row in Table A matches many rows in Table B. One department, many employees. One product, many sales records.&lt;/p&gt;

&lt;p&gt;-One-to-One: rare in practice. If two tables have a 1:1 relationship, you can usually just merge them.&lt;/p&gt;

&lt;p&gt;-Many-to-Many: Power BI supports it, but it needs deliberate handling. Used carelessly, it produces duplicated or inflated results&lt;/p&gt;

&lt;p&gt;2.&lt;strong&gt;Cross-filter Direction — which way filters flow&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;-Single: filters flow one way only, from the dimension table to the fact table. This is the default and the safest option.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Both: filters flow in both directions. Useful with Many-to-Many or role-playing dimensions, but can cause filter ambiguity in complex models. Use it intentionally.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;3.&lt;strong&gt;Active vs Inactive Relationships&lt;/strong&gt;&lt;br&gt;
Only one relationship between two tables can be active at a time. In the Model view, active relationships appear as solid lines, while inactive relationships are shown as dashed lines. You can double-click any relationship line to open the Edit Relationship dialog and toggle the Active checkbox directly, making it the permanent default. Alternatively, keep it inactive and call it on demand in DAX using USERELATIONSHIP()&lt;br&gt;
. &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Joins — Merging Tables in Power Query&lt;/strong&gt;&lt;br&gt;
Joins happen in Power Query. When you use Merge Queries, you are combining two tables based on a shared column. The join type you choose determines which rows survive the merge.&lt;br&gt;
Here is every join type in Power Query, and when to actually use it:&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F9b39d2x9jxg9hbisqh0k.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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F9b39d2x9jxg9hbisqh0k.png" alt=" " width="800" height="393"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;In practice, Left Outer is the one you will reach for most often. Keep everything from your main table, bring in what matches from the lookup table, and handle any nulls from there.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;How It All Fits Together — A Real Example&lt;/strong&gt;&lt;br&gt;
Say you are building an HR dashboard from a dataset, with employee records, salaries, bonuses, and departments.&lt;br&gt;
•Your fact table is the employee records — salaries, bonuses, performance scores, and project counts.&lt;br&gt;
•Your dimension tables are Department, Location, and Employee Type.&lt;br&gt;
•You build a star schema with the employee table in the centre.&lt;br&gt;
•Power BI creates one-to-many relationships between each dimension and the fact table.&lt;br&gt;
•If you needed to bring in a separate leave records table, you would use a Left Outer join in Power Query to merge it in before loading.&lt;/p&gt;

&lt;p&gt;Now, when someone slices by department or filters by location, Power BI knows exactly how to follow those relationships and return the right numbers every time.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The Takeaway&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Many of us start creating visuals in Power BI and later question why our totals do not add up or why the slicers behave unexpectedly. The solution is often found within the model.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Get the schema right. Define your relationships carefully. Understand your joins before you load. The visuals will take care of themselves.&lt;/strong&gt;&lt;/p&gt;

</description>
    </item>
    <item>
      <title>How Excel Is Actually Used in Real-World Data Analysis</title>
      <dc:creator>Joan</dc:creator>
      <pubDate>Sat, 06 Jun 2026 06:21:46 +0000</pubDate>
      <link>https://dev.to/joan_ae8a2f2d1918a74de9a3/how-excel-is-actually-used-in-real-world-data-analysis-20aj</link>
      <guid>https://dev.to/joan_ae8a2f2d1918a74de9a3/how-excel-is-actually-used-in-real-world-data-analysis-20aj</guid>
      <description>&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%2Fpxsqk840he1ayndd8y4o.jpg" 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%2Fpxsqk840he1ayndd8y4o.jpg" alt=" " width="736" height="736"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;I’ll be honest, when I first heard “Excel for data analysis,” I mentally filed it under things I already know. I’ve spent a few years in tech, pre-sales, project management, and vendor partnerships, and I figured Excel was just spreadsheets with a few formulas. I was wrong.&lt;/p&gt;

&lt;p&gt;This week in my Data Science &amp;amp; Analytics course at LuxDev HQ, we worked on an HR dataset. And it was messy. Missing hire dates, duplicate employees, an age listed as 99 and someone’s project count written as “ten” instead of 10. Real data. Real chaos.&lt;/p&gt;

&lt;p&gt;Working through that dataset taught me more about data than any definition ever could. Here’s what I’ve learned about how Excel is really used in practice.&lt;/p&gt;

&lt;p&gt;But first, what is Excel?&lt;/p&gt;

&lt;p&gt;Excel is a spreadsheet tool from Microsoft for storing, organising, and analysing data in rows and columns. Think of it as a super-powered table one where you can run calculations, spot patterns, and clean up messy information, all in one place. &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;3 Ways Excel Shows Up in the Real World&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;HR &amp;amp; People Data Management&lt;br&gt;
    HR teams use Excel to track headcount, flag performance gaps,   and plan promotions. Our dataset spanned 80+ employees, multiple departments, and locations from Nairobi to New York. Excel is what kept the chaos in check and made the analysis possible&lt;/p&gt;

&lt;p&gt;Financial Reporting &amp;amp; Payroll&lt;br&gt;
  Before any payroll report goes out, someone has to total the right figures, check for missing entries, and make sure everything adds up. That work happens in Excel, using the exact formulas we practiced in class.&lt;/p&gt;

&lt;p&gt;Business Decision-Making&lt;br&gt;
 When a manager asks “How many permanent staff are in Nairobi?” or “What’s the total bonus payout for Sales?”—those are business questions that Excel answers in seconds, with the right formula.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;3 Excel Features I Learned This Week&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Conditional Formatting&lt;/p&gt;

&lt;p&gt;This highlights cells automatically based on rules you set. I used it to spot outliers—an age of 99, a last promotion year of 1900, and a bonus with a currency symbol. Instead of scanning hundreds of rows, Excel flagged the problems instantly.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;ROUND, ROUNDUP&lt;/strong&gt; &lt;br&gt;
These functions turn rough numbers into professional reporting&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;SUMIF, SUMIFS, COUNTBLANK, COUNTIF, COUNTIFS — Aggregate Functions with Conditions&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;This is where Excel starts to feel like actual analysis. These functions let you ask specific questions of your data, not just “what’s the total” but “what’s the total for this specific group, under these specific conditions.”&lt;br&gt;
&lt;strong&gt;COUNTBLANK&lt;/strong&gt;** This counts every empty cell, so before I even started cleaning, I knew exactly how many gaps I was dealing with.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;COUNTIF&lt;/strong&gt; lets me count how many employees belonged to each department, or how many had a performance score of 8 or above. One formula, one condition.&lt;br&gt;
&lt;strong&gt;COUNTIFS&lt;/strong&gt;** took it further, two or more conditions at once. How many employees are Interns, female, above  40 yrs   AND based in Nairobi? How many are in IT AND fully remote? &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;SUMIF&lt;/strong&gt; gave me the total bonus paid out to the Sales department. =SUMIF(D:D, "Sales", K: K)  that’s it. One formula.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;SUMIFS&lt;/strong&gt; added another layer, total bonuses for Permanent staff in the Sales department only. Multiple columns, multiple conditions, one clean result. This is what financial summaries are actually built from.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;How This Week Changed the Way I See Data&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Before this week, I saw data as something you simply report. Now, I realize data is something you interrogate, challenge, and understand before you trust it. Every inconsistency is a clue to a human story or a broken process. It’s the analyst’s job to find, fix, and ensure the data is trustworthy before anyone makes a decision based on it.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;If you’re just getting into data analytics, start with Excel. It will teach you how to think about data long before you write your first line of code.&lt;/strong&gt;&lt;/p&gt;

</description>
    </item>
  </channel>
</rss>
