<?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: Jason Ndalamia</title>
    <description>The latest articles on Forem by Jason Ndalamia (@jason_ndalamia).</description>
    <link>https://forem.com/jason_ndalamia</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%2F3709633%2Fef3e745b-a431-436f-8952-a9f4bf18dba8.jpg</url>
      <title>Forem: Jason Ndalamia</title>
      <link>https://forem.com/jason_ndalamia</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://forem.com/feed/jason_ndalamia"/>
    <language>en</language>
    <item>
      <title>Getting Started with Python: A Practical Introduction for Beginners</title>
      <dc:creator>Jason Ndalamia</dc:creator>
      <pubDate>Wed, 06 May 2026 10:16:08 +0000</pubDate>
      <link>https://forem.com/jason_ndalamia/getting-started-with-python-a-practical-introduction-for-beginners-4ccc</link>
      <guid>https://forem.com/jason_ndalamia/getting-started-with-python-a-practical-introduction-for-beginners-4ccc</guid>
      <description>&lt;p&gt;Welcome to the world of Python! If you are just starting your programming journey, you have chosen the perfect language. This beginner-friendly guide will teach you the fundamentals of Python in a simple, practical, and engaging way.&lt;/p&gt;




&lt;h2&gt;
  
  
  1. Introduction
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;What is Python?&lt;/strong&gt; Python is a powerful, flexible, and dynamically typed programming language created by Guido van Rossum and first released in 1991. It is widely considered one of the most loved and used programming languages in the world.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Why is it Popular?&lt;/strong&gt; Imagine you are cooking: would you rather follow a long, complex recipe full of jargon, or a simple one written in plain English? Python is designed to be highly readable, looking almost like spoken English rather than complex machine code. It allows you to write fewer lines of code to achieve the same result as other languages, like Java.&lt;/p&gt;

&lt;p&gt;Python is highly versatile and serves as a "multi-tool" for a wide range of real-world scenarios. It is used for web development (powering apps like Instagram and YouTube), data analysis, AI, machine learning, and system scripting (automating repetitive computer tasks). It has even been used by NASA for rocket logic!&lt;/p&gt;




&lt;h2&gt;
  
  
  2. Installation
&lt;/h2&gt;

&lt;p&gt;Before writing code, you need to set up Python on your computer.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Step-by-Step Guide:&lt;/strong&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Download Python:&lt;/strong&gt; For Windows users, you can safely download the latest version (like Python 3.12) directly from the Microsoft Store. &lt;em&gt;(Note: You can also download it from the official website at (&lt;a href="https://www.python.org/downloads/" rel="noopener noreferrer"&gt;https://www.python.org/downloads/&lt;/a&gt;), which is standard industry practice, though not explicitly linked in the provided sources. Please independently verify this URL.&lt;/em&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Install:&lt;/strong&gt; Run the downloaded installer. It is critical during this step to ensure Python is added to your system's "PATH" environment variable, which allows your system to recognize Python commands in your terminal.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;strong&gt;Verify Installation:&lt;/strong&gt; Once installed, open your Command Prompt (CMD) or terminal. Type the following command and press Enter to verify your installation:&lt;br&gt;
python --version&lt;br&gt;
&lt;em&gt;(Note for Mac and Linux users: You may need to use python3 --version.)&lt;/em&gt;&lt;/p&gt;


&lt;h2&gt;
  
  
  3. Your First Program: Hello World
&lt;/h2&gt;

&lt;p&gt;In Python, writing your first program is incredibly simple and avoids confusing symbols or extra fluff. Let's write a program that displays a message on the screen.&lt;br&gt;
&lt;code&gt;print("Hello, World!")&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What the code does:&lt;/strong&gt; Think of the &lt;code&gt;print()&lt;/code&gt; command as a megaphone. You are giving Python a clear, direct instruction: "Hey, shout this message on the screen!". Because Python is an interpreted language, it runs your code line by line and immediately outputs the result.&lt;/p&gt;


&lt;h2&gt;
  
  
  4. Comments in Python
&lt;/h2&gt;

&lt;p&gt;Comments are notes left in the code for humans to read. Python ignores them when running the program, but they are crucial for explaining what your logic does.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;em&gt;Single-Line Comments:&lt;/em&gt;&lt;/strong&gt; You can create a single-line comment by using the hash symbol &lt;code&gt;#&lt;/code&gt;. As a best practice, try to keep your comment lines from exceeding 72 characters.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="c1"&gt;# This line is ignored by Python
&lt;/span&gt;&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Hello!&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;  &lt;span class="c1"&gt;# You can also place comments after code
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;&lt;em&gt;Multi-Line Comments:&lt;/em&gt;&lt;/strong&gt; For longer explanations, you can use triple quotes &lt;code&gt;(""")&lt;/code&gt; to create a multi-line string, which Python treats as a multi-line comment when not assigned to a variable.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="sh"&gt;"""&lt;/span&gt;&lt;span class="s"&gt;
This is a
multi-line comment.
It is great for long explanations!
&lt;/span&gt;&lt;span class="sh"&gt;"""&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  5. Variables
&lt;/h2&gt;

&lt;p&gt;Imagine your brain is a giant notebook; when you learn something new, you store it under a label. In Python, &lt;strong&gt;variables&lt;/strong&gt; act as labelled boxes or containers where you store data to open and use later.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Rules for Naming Variables:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Must start with a letter (a–z, A–Z) or an underscore _ (e.g., _my_age).&lt;/li&gt;
&lt;li&gt;Cannot start with a number (e.g., 1user is invalid).&lt;/li&gt;
&lt;li&gt;Can only contain alphanumeric characters and underscores.&lt;/li&gt;
&lt;li&gt;Names are case-sensitive (name and NAME are completely different).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Tip:&lt;/strong&gt; Use descriptive names in snake_case (e.g., user_name instead of just x).&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Examples of Different Data Types:&lt;/strong&gt; Because Python is dynamically typed, you don't need to specify the data type—Python figures it out automatically based on the value you assign.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Integer (int) - Whole numbers like counting apples&lt;br&gt;
age = 25&lt;br&gt;&lt;br&gt;
Float (float) - Decimal numbers like measuring height&lt;br&gt;
height = 5.9&lt;br&gt;&lt;br&gt;
String (str) - Text enclosed in single or double quotes&lt;br&gt;
name = "Alice"&lt;br&gt;&lt;br&gt;
Boolean (bool) - True or False values, like a light switch (ON/OFF)&lt;br&gt;
is_logged_in = True  &lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  6. Operators
&lt;/h2&gt;

&lt;p&gt;Operators allow you to perform calculations or compare data in Python.&lt;br&gt;
&lt;strong&gt;Arithmetic Operators:&lt;/strong&gt; Used to perform standard mathematical calculations.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="n"&gt;a&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;10&lt;/span&gt;
&lt;span class="n"&gt;b&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;
&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;a&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;b&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;   &lt;span class="c1"&gt;# Addition: outputs 13
&lt;/span&gt;&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;a&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="n"&gt;b&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;   &lt;span class="c1"&gt;# Subtraction: outputs 7
&lt;/span&gt;&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;a&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="n"&gt;b&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;   &lt;span class="c1"&gt;# Multiplication: outputs 30
&lt;/span&gt;&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;a&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="n"&gt;b&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;   &lt;span class="c1"&gt;# Division: outputs 3.333...
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Comparison Operators:&lt;/strong&gt; Used to compare two values. They act as "Yes/No" questions and always result in a Boolean (True or False).&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="n"&gt;x&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;10&lt;/span&gt;
&lt;span class="n"&gt;y&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;9&lt;/span&gt;
&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;x&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;y&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;   &lt;span class="c1"&gt;# Greater than: True
&lt;/span&gt;&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;x&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="n"&gt;y&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;  &lt;span class="c1"&gt;# Equal to: False
&lt;/span&gt;&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;x&lt;/span&gt; &lt;span class="o"&gt;!=&lt;/span&gt; &lt;span class="n"&gt;y&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;  &lt;span class="c1"&gt;# Not equal to: True
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Logical Operators:&lt;/strong&gt; Used to check multiple conditions at once using and and or.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="n"&gt;age&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;20&lt;/span&gt;
&lt;span class="n"&gt;has_ticket&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="bp"&gt;True&lt;/span&gt;&lt;span class="err"&gt;`&lt;/span&gt;
&lt;span class="c1"&gt;# 'and' means both conditions MUST be True`
&lt;/span&gt;&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;age&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;=&lt;/span&gt; &lt;span class="mi"&gt;18&lt;/span&gt; &lt;span class="ow"&gt;and&lt;/span&gt; &lt;span class="n"&gt;has_ticket&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Entry allowed.&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;else&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Entry denied.&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






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

&lt;p&gt;You've just taken your first steps into Python! We covered how Python's readable syntax makes programming feel like writing English, how to install and run your first &lt;strong&gt;"Hello, World!"&lt;/strong&gt; program, and how to use foundational concepts like variables, data types, and operators.&lt;/p&gt;

</description>
      <category>python</category>
      <category>programming</category>
      <category>datascience</category>
      <category>machinelearning</category>
    </item>
    <item>
      <title>Integrating SQL Databases with Power BI for Advanced Analytics: A Complete Guide</title>
      <dc:creator>Jason Ndalamia</dc:creator>
      <pubDate>Sun, 03 May 2026 10:04:07 +0000</pubDate>
      <link>https://forem.com/jason_ndalamia/mastering-data-pipelines-integrating-sql-databases-with-power-bi-for-advanced-analytics-382h</link>
      <guid>https://forem.com/jason_ndalamia/mastering-data-pipelines-integrating-sql-databases-with-power-bi-for-advanced-analytics-382h</guid>
      <description>&lt;p&gt;Power BI is a powerful business analytics service developed by Microsoft that empowers users to visualise data and share interactive dashboards across their organisation. While Power BI can handle data from various sources, its true potential is unleashed when connected to robust data sources like SQL databases.&lt;/p&gt;

&lt;p&gt;SQL databases—such as &lt;strong&gt;PostgreSQL, MySQL,&lt;/strong&gt; and &lt;strong&gt;SQL Server&lt;/strong&gt;—are the industry standard for storing and managing structured analytical data. They offer ACID compliance for reliable transaction processing, making them the perfect backbone for managing critical business information.&lt;br&gt;
In this guide, we will walk you through connecting Power BI to both local and cloud PostgreSQL databases, modelling your data, and leveraging SQL skills for better reporting.&lt;/p&gt;

&lt;h1&gt;
  
  
  1. Connecting Power BI to a Local PostgreSQL Database
&lt;/h1&gt;

&lt;p&gt;Many data analysts build prototypes using a local PostgreSQL database before deploying them to a production environment. Here is how to establish that connection:&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 1: Open Power BI Desktop and Select Get Data
&lt;/h2&gt;

&lt;p&gt;Launch Power BI Desktop. On the Home ribbon, click the Get Data button to open the data import dialog.&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%2Fvg4oir24mvaewe97mqql.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%2Fvg4oir24mvaewe97mqql.png" alt="Power BI Desktop interface highlighting the Get Data button on the Home ribbon" width="800" height="94"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;In the Get Data window, expand &lt;strong&gt;Database&lt;/strong&gt; on the left and select &lt;strong&gt;PostgreSQL database&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.amazonaws.com%2Fuploads%2Farticles%2F3ud8rckjllr0nzl82k4w.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%2F3ud8rckjllr0nzl82k4w.png" alt="Get Data dialog showing list of connectors with PostgreSQL selected" width="692" height="674"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 2: Configure the PostgreSQL Connection
&lt;/h2&gt;

&lt;p&gt;In the connection dialog, you will be prompted for your server and database details. For a local machine, enter localhost (or 127.0.0.1) in the &lt;strong&gt;Server&lt;/strong&gt; field, and type the name of your database (e.g., postgres or sales_db) in the &lt;strong&gt;Database&lt;/strong&gt; field.&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%2Fmpq8ul4xrxdpsy8zusvr.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%2Fmpq8ul4xrxdpsy8zusvr.png" alt="PostgreSQL Database connection dialog with 'localhost' and database name" width="717" height="363"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;You can choose your Data Connectivity mode here—&lt;strong&gt;Import&lt;/strong&gt; is typically recommended to copy tables into Power BI for fast, offline queries. Click &lt;strong&gt;OK&lt;/strong&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 3: Authenticate and Load Tables
&lt;/h2&gt;

&lt;p&gt;When prompted, select &lt;strong&gt;Basic&lt;/strong&gt; authentication and enter your PostgreSQL username and password.&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%2F4gzn7suiopvl7bktdkuh.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%2F4gzn7suiopvl7bktdkuh.png" alt="PostgreSQL Database connection dialog with User name and password fields" width="710" height="313"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Once authenticated, the &lt;strong&gt;Navigator&lt;/strong&gt; window will display all available schemas and tables. You can click each table to preview its data. Select the tables you want to import (for example, customers, products, sales, and inventory).&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%2F1pdt9ocn01104js6xafy.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%2F1pdt9ocn01104js6xafy.png" alt="Navigator dialog with a list of tables" width="696" height="250"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Click &lt;strong&gt;Load&lt;/strong&gt; to import them directly or &lt;strong&gt;Transform Data&lt;/strong&gt; to make changes first. Power BI will load the data into its data model.&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 4: Verify Loaded Tables
&lt;/h2&gt;

&lt;p&gt;After loading, the selected tables appear in the Power BI interface. The Data/Report view now lists the imported tables in the Fields pane on the right.&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%2F09h1loif2a2gi16mjikp.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%2F09h1loif2a2gi16mjikp.png" alt="Table view showing loaded tables and Fields pane" width="800" height="430"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;h1&gt;
  
  
  2. Connecting Power BI to a Cloud Database (Aiven PostgreSQL)
&lt;/h1&gt;

&lt;p&gt;When using a managed cloud database like Aiven PostgreSQL, the process is similar but adds a security step.&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 1: Gather Aiven Connection Details
&lt;/h2&gt;

&lt;p&gt;In your Aiven web console, open the &lt;strong&gt;Overview&lt;/strong&gt; page. Copy the &lt;strong&gt;Host name, Port, Database name, User name,&lt;/strong&gt; and &lt;strong&gt;Password&lt;/strong&gt;. Also note the &lt;strong&gt;SSL mode&lt;/strong&gt; (usually "require").&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%2Fcpgq54n1enszplmlciuy.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%2Fcpgq54n1enszplmlciuy.png" alt="Aiven Connection details page" width="800" height="286"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 2: Download and Install the SSL Certificate
&lt;/h2&gt;

&lt;p&gt;Aiven enforces encrypted (TLS) connections. Find the &lt;strong&gt;CA certificate&lt;/strong&gt; link on the Overview page and download the ca.pem file.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;To install the certificate on Windows:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Press Win + R, type certmgr.msc, and press &lt;strong&gt;Enter&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Expand the &lt;strong&gt;Trusted Root Certification Authorities&lt;/strong&gt; folder.&lt;/li&gt;
&lt;li&gt;Right-click &lt;strong&gt;Certificates&lt;/strong&gt;, select &lt;strong&gt;All Tasks &amp;gt; Import&lt;/strong&gt;.&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.amazonaws.com%2Fuploads%2Farticles%2Ft9m1rgy49fx39o6y7bjh.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%2Ft9m1rgy49fx39o6y7bjh.png" alt="certmgr window showing Trusted Root folder" width="625" height="445"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Browse to select the ca.pem file (change file type to "All Files").&lt;/li&gt;
&lt;li&gt;Ensure it is placed in the &lt;strong&gt;Trusted Root Certification Authorities&lt;/strong&gt; store and click &lt;strong&gt;Finish&lt;/strong&gt;.&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.amazonaws.com%2Fuploads%2Farticles%2Fd9myiine6aru8c5b0sbg.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%2Fd9myiine6aru8c5b0sbg.png" alt="Certificate Import Wizard selection screen" width="638" height="567"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 3: Connect from Power BI Desktop
&lt;/h2&gt;

&lt;p&gt;Back in Power BI Desktop, go to &lt;strong&gt;Get Data &amp;gt; PostgreSQL database&lt;/strong&gt;. Enter the &lt;strong&gt;Server&lt;/strong&gt; as host:port (e.g., pg-instance.aivencloud.com:12345) and the &lt;strong&gt;Database&lt;/strong&gt; name.&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%2Fwdue2113b7ix6mdxzfyk.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%2Fwdue2113b7ix6mdxzfyk.png" alt="PostgreSQL connection dialog for Aiven cloud host" width="707" height="353"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 4: Load Cloud Tables
&lt;/h2&gt;

&lt;p&gt;Enter the Aiven &lt;strong&gt;Username&lt;/strong&gt; and &lt;strong&gt;Password&lt;/strong&gt;. If the SSL certificate was installed correctly, the Navigator will appear. Select your tables and click &lt;strong&gt;Load&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.amazonaws.com%2Fuploads%2Farticles%2F0rbt0n1s6ny6zh6ml9ze.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%2F0rbt0n1s6ny6zh6ml9ze.png" alt="Navigator showing Aiven cloud tables" width="800" height="632"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;h1&gt;
  
  
  3. Loading Tables and Data Modeling
&lt;/h1&gt;

&lt;p&gt;Once connected, you must define how these tables interact through &lt;strong&gt;data modeling.&lt;/strong&gt;&lt;br&gt;
A standard approach is the &lt;strong&gt;star schema&lt;/strong&gt;, where a central &lt;strong&gt;fact table&lt;/strong&gt; (like sales) connects to surrounding &lt;strong&gt;dimension tables&lt;/strong&gt; (like customers and products). These links are formed by joining &lt;strong&gt;Primary Keys&lt;/strong&gt; and &lt;strong&gt;Foreign Keys&lt;/strong&gt;, creating a &lt;strong&gt;one-to-many relationship&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.amazonaws.com%2Fuploads%2Farticles%2F2dmv98s1w2vfdss2yqkq.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%2F2dmv98s1w2vfdss2yqkq.png" alt="Entity relationship diagram in Model view showing arrows connecting tables" width="800" height="423"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Why are relationships important?&lt;/strong&gt;&lt;br&gt;
Proper relationships allow Power BI to aggregate and filter metrics correctly. Without them, visuals could return incorrect numbers because the software wouldn't know how to join the data points across different tables.&lt;/p&gt;




&lt;h1&gt;
  
  
  4. Why SQL Skills Matter for Power BI Analysts
&lt;/h1&gt;

&lt;p&gt;While Power BI's drag-and-drop features are incredibly powerful, foundational SQL skills separate good analysts from great ones. SQL allows you to:&lt;br&gt;
&lt;strong&gt;Retrieve Data:&lt;/strong&gt; Pull only specific columns to reduce memory consumption.&lt;br&gt;
&lt;strong&gt;Filter Datasets:&lt;/strong&gt; Use a WHERE clause to pre-filter data at the source, speeding up loading times.&lt;br&gt;
&lt;strong&gt;Perform Aggregations:&lt;/strong&gt; Use SUM, COUNT, or GROUP BY to push heavy calculations to the database engine.&lt;br&gt;
&lt;strong&gt;Prepare and Shape Data:&lt;/strong&gt; Handle null values, cast data types, and join tables into a single view before importing.&lt;/p&gt;




&lt;h1&gt;
  
  
  Conclusion
&lt;/h1&gt;

&lt;p&gt;Connecting Power BI to SQL databases unlocks the highest level of business intelligence. By combining Power BI's visual capabilities with SQL's structural precision, analysts can build trustworthy, lightning-fast dashboards that drive strategic decisions.&lt;/p&gt;

</description>
      <category>powerbi</category>
      <category>dataanalytics</category>
      <category>postgres</category>
      <category>aiven</category>
    </item>
    <item>
      <title>Beyond the Basics: 5 Game-Changing Secrets of SQL Joins and Window Functions</title>
      <dc:creator>Jason Ndalamia</dc:creator>
      <pubDate>Mon, 02 Mar 2026 07:05:39 +0000</pubDate>
      <link>https://forem.com/jason_ndalamia/beyond-the-basics-5-game-changing-secrets-of-sql-joins-and-window-functions-2m5e</link>
      <guid>https://forem.com/jason_ndalamia/beyond-the-basics-5-game-changing-secrets-of-sql-joins-and-window-functions-2m5e</guid>
      <description>&lt;h2&gt;
  
  
  1. Introduction: The Data Relationships Hook
&lt;/h2&gt;

&lt;p&gt;Think of a database as a digital filing cabinet. In this architecture, information is organized into drawers—or schemas—such as HR, Finance, or Sales. Within these drawers sit the documents, which represent our individual tables.&lt;/p&gt;

&lt;p&gt;While this structure ensures clean organization, real-world business intelligence rarely lives in a single drawer. To answer strategic questions, you must bridge the gaps between disparate tables without creating a "data mess". Whether you are joining sales records with inventory levels or HR data with finance budgets, mastering these relationships is what separates a basic query-writer from a Senior Architect. This guide distills complex SQL operations into high-impact takeaways, focusing on maintaining relational integrity while scaling your analysis.&lt;/p&gt;




&lt;h2&gt;
  
  
  2. The Horizontal vs. Vertical Divide: Joins vs. Unions
&lt;/h2&gt;

&lt;p&gt;The most fundamental distinction in data architecture is how you choose to expand your result set.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  &lt;strong&gt;Joins&lt;/strong&gt; combine tables &lt;em&gt;horizontally&lt;/em&gt;. They add columns based on a shared key (like a Primary or Foreign Key), making the result set "wider".&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;Unions&lt;/strong&gt; combine tables &lt;em&gt;vertically&lt;/em&gt;. They stack rows from one dataset on top of another, making the result set "longer".&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;For a UNION to be architecturally sound, the query must meet three strict structural requirements: the columns must be in the same order, have the same count, and—most importantly—possess matching data types. As an architect, you must remember that the database engine is indifferent to your column aliases but ruthless regarding data types.&lt;/p&gt;

&lt;p&gt;"The database doesn't care about naming but cares about data types in Unions... If a VARCHAR is matched with an INT, the database will throw a mismatch error." — &lt;a href="https://www.datawithbaraa.com/wiki/sql" rel="noopener noreferrer"&gt;Data with Baraa&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The Mental Model: Distinct vs. All&lt;/strong&gt; From a strategy perspective, think of UNION as a DISTINCT operation for stacked rows; it automatically removes duplicates. If you need the "data as is" without the overhead of deduplication, &lt;strong&gt;UNION ALL&lt;/strong&gt; is your preferred tool.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Sample Query: Vertical Stacking&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="c1"&gt;-- Combining customer and employee names into a single master list&lt;/span&gt;
&lt;span class="k"&gt;SELECT&lt;/span&gt; &lt;span class="n"&gt;first_name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;last_name&lt;/span&gt; &lt;span class="k"&gt;FROM&lt;/span&gt; &lt;span class="n"&gt;customers&lt;/span&gt;
&lt;span class="k"&gt;UNION&lt;/span&gt;
&lt;span class="k"&gt;SELECT&lt;/span&gt; &lt;span class="n"&gt;first_name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;last_name&lt;/span&gt; &lt;span class="k"&gt;FROM&lt;/span&gt; &lt;span class="n"&gt;employees&lt;/span&gt;
&lt;span class="k"&gt;LIMIT&lt;/span&gt; &lt;span class="mi"&gt;100&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  3. The "Workhorse" Joins: Why Left is Often Better than Right
&lt;/h2&gt;

&lt;p&gt;In relational logic, the Inner Join is the default state. When you use the JOIN keyword, SQL is explicitly looking for matching values in the ON statement. If a record in the first table—for example, a customer who hasn't placed an order yet—has no match in the second table, that record "disappears" from the final result set.&lt;/p&gt;

&lt;p&gt;For high-level reporting where data integrity is paramount, the Left Join is the industry workhorse. It preserves every record from the left (first) table and fills missing data from the right table with NULL values. This ensures you don't accidentally drop crucial business entities (like customers or products) simply because they lack transaction history.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Architectural Insight&lt;/strong&gt;: The Right Join is functionally redundant. Any Right Join can be reframed as a Left Join by simply reordering the tables. In production environments, Left Joins are the standard because they align with a left-to-right reading flow, making queries significantly easier to audit and maintain.&lt;/p&gt;

&lt;p&gt;Sample Query: Production-Ready Left Join&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="c1"&gt;-- Retrieving all customers and any associated event data&lt;/span&gt;
&lt;span class="k"&gt;SELECT&lt;/span&gt;
  &lt;span class="k"&gt;c&lt;/span&gt;&lt;span class="p"&gt;.&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;c&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;first_name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="n"&gt;e&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;event_name&lt;/span&gt;
&lt;span class="k"&gt;FROM&lt;/span&gt; &lt;span class="n"&gt;customers&lt;/span&gt; &lt;span class="k"&gt;AS&lt;/span&gt; &lt;span class="k"&gt;c&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;events&lt;/span&gt; &lt;span class="k"&gt;AS&lt;/span&gt; &lt;span class="n"&gt;e&lt;/span&gt;
  &lt;span class="k"&gt;ON&lt;/span&gt; &lt;span class="k"&gt;c&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;customer_id&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;e&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;WHERE&lt;/span&gt; &lt;span class="k"&gt;c&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;IS&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;LIMIT&lt;/span&gt; &lt;span class="mi"&gt;500&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  4. The Cartesian Chaos: Understanding the Cross Join
&lt;/h2&gt;

&lt;p&gt;A Cross Join represents the "Cartesian Product" of two tables. Unlike other joins, it ignores matching values entirely, attaching every row of the second table to every row of the first. If you join a 1,000-row table with a 500-row table, you will generate a massive result set of 500,000 rows.&lt;/p&gt;

&lt;p&gt;In standard relational reporting, Cross Joins are often avoided because they lack the primary/foreign key bond that defines logical relationships. Joining a car table and an item table by a shared color attribute "wouldn't make any sense" for data integrity. However, from a strategic standpoint, Cross Joins are powerful for generating permutations—such as creating a master grid of every possible product-color combination for an inventory audit.&lt;/p&gt;




&lt;h2&gt;
  
  
  5. Window Functions: Grouping Without the "Collapse"
&lt;/h2&gt;

&lt;p&gt;The true "game-changer" for intermediate learners is the OVER() clause. Traditional GROUP BY operations "collapse" your data, rolling multiple rows into a single aggregate level. While useful for summaries, this loses the individual row detail.&lt;/p&gt;

&lt;p&gt;Window Functions allow you to perform calculations across a result set while keeping every unique row intact. This allows you to view an individual's salary right next to the department average, or calculate a Rolling Total.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Strategic Use Case&lt;/strong&gt;: The Rolling Total In finance and healthcare, tracking cumulative sums is vital. By adding an ORDER BY clause inside the OVER() window, you transform a static sum into a running balance.&lt;/p&gt;

&lt;p&gt;Sample Query: Rolling Totals and Averages&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="c1"&gt;-- Calculating a cumulative salary sum and a static department average&lt;/span&gt;
&lt;span class="k"&gt;SELECT&lt;/span&gt;
  &lt;span class="n"&gt;first_name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="n"&gt;gender&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="n"&gt;salary&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;salary&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="n"&gt;OVER&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;PARTITION&lt;/span&gt; &lt;span class="k"&gt;BY&lt;/span&gt; &lt;span class="n"&gt;gender&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;employee_id&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;rolling_total&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="k"&gt;AVG&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;salary&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="n"&gt;OVER&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;PARTITION&lt;/span&gt; &lt;span class="k"&gt;BY&lt;/span&gt; &lt;span class="n"&gt;gender&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;avg_dept_salary&lt;/span&gt;
&lt;span class="k"&gt;FROM&lt;/span&gt; &lt;span class="n"&gt;employees&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  6. The Ranking Trio: Row Number, Rank, and Dense Rank
&lt;/h2&gt;

&lt;p&gt;Sequencing data is a core requirement for leaderboards and performance tracking. SQL offers three nuances for handling ties within a window:&lt;br&gt;
&lt;strong&gt;•Row Number&lt;/strong&gt;: Assigns a unique, sequential integer to every row (1, 2, 3, 4). Even in the event of a tie, the numbers will not repeat.&lt;br&gt;
&lt;strong&gt;•Rank&lt;/strong&gt;: Assigns the same number to ties but skips the next position based on the count of duplicates. If two rows tie for 1st, the next is 3rd (1, 1, 3). This is "positional" ranking.&lt;br&gt;
&lt;strong&gt;•Dense Rank&lt;/strong&gt;: Assigns the same number to ties but keeps the next number sequential (1, 1, 2). This is "numerical" ranking.&lt;br&gt;
Architectural Preference: DENSE_RANK is typically preferred for professional reporting. It ensures there are no "gaps" in your leaderboard, maintaining a clean hierarchy regardless of how many entities share the same value.7. &lt;/p&gt;




&lt;h2&gt;
  
  
  Conclusion: Levelling Up Your Query Game
&lt;/h2&gt;

&lt;p&gt;Moving from a beginner to an advanced analyst is less about learning syntax and more about understanding the logic of relationships. Every time you approach a new dataset, you must make a strategic choice: do you need to collapse your data into an aggregate summary with a Join or Group By, or do you need to partition it with a Window Function to maintain row-level detail?&lt;/p&gt;

&lt;p&gt;The absolute grounding rule of SQL is that it is a language of relationships. By mastering the nuances of how data stacks vertically via Unions or expands horizontally via Joins, you ensure the relational integrity of your architecture.&lt;/p&gt;

</description>
      <category>sql</category>
      <category>dataanalytics</category>
      <category>database</category>
      <category>programming</category>
    </item>
    <item>
      <title>How Analysts Translate Messy Data, DAX, and Dashboards into Action Using Power BI</title>
      <dc:creator>Jason Ndalamia</dc:creator>
      <pubDate>Sun, 08 Feb 2026 12:07:03 +0000</pubDate>
      <link>https://forem.com/jason_ndalamia/how-analysts-translate-messy-data-dax-and-dashboards-into-action-using-power-bi-f77</link>
      <guid>https://forem.com/jason_ndalamia/how-analysts-translate-messy-data-dax-and-dashboards-into-action-using-power-bi-f77</guid>
      <description>&lt;p&gt;In the realm of business intelligence, the distance between a raw spreadsheet and a strategic decision is bridged by the data analyst’s technical workflow. Using Power BI, analysts do not merely report numbers; they architect a system that transforms chaotic inputs into clear, actionable insights. This process follows a rigorous path: harmonising messy data, structuring it for performance, applying business logic through DAX, and delivering clarity via interactive dashboards.&lt;/p&gt;




&lt;h2&gt;
  
  
  1. Taming the Chaos: From Messy Data to Trusted Information
&lt;/h2&gt;

&lt;p&gt;Real-world data is rarely ready for immediate analysis. It arrives full of inconsistencies that can break calculations and skew results. Before any visualisation occurs, analysts use Power Query to clean and transform this raw material into trusted information.&lt;br&gt;
&lt;strong&gt;• Harmonising Data:&lt;/strong&gt; A common issue is the presence of "pseudo-blanks"—text entries like "NA," "error," "blank," or "not provided" mixed into columns. Power BI reads this as valid text rather than missing values. Analysts must use the "Replace Values" function to harmonise these into a single standard category, such as "unknown," to ensure accurate categorisation without deleting potentially valuable raw data.&lt;br&gt;
&lt;strong&gt;• Ensuring Precision:&lt;/strong&gt; Small formatting errors can lead to duplication. For instance, "Kenya " (with a space) and "Kenya" are treated as different values. Analysts use the TRIM function to remove leading and trailing whitespace, ensuring that categories aggregate correctly.&lt;br&gt;
&lt;strong&gt;• Data Typing:&lt;/strong&gt; Attempting to sum a column will fail if the data type is set to text. Analysts must rigorously define columns—setting revenue to "Decimal Number" for calculation while keeping identifiers like phone numbers as "Text" to prevent accidental aggregation.&lt;/p&gt;




&lt;h2&gt;
  
  
  2. The Blueprint for Speed: The Star Schema
&lt;/h2&gt;

&lt;p&gt;A major pitfall in data management is the "flat table"—a single, massive spreadsheet containing every detail. This structure leads to duplication, wasted memory, and maintenance nightmares.&lt;br&gt;
To solve this, analysts employ the Star Schema, a modelling technique that separates data into two distinct types:&lt;br&gt;
&lt;strong&gt;• Fact Tables:&lt;/strong&gt; These contain transactional metrics (e.g., Sales, Quantity, Total Revenue) and sit at the centre of the model.&lt;br&gt;
&lt;strong&gt;• Dimension Tables:&lt;/strong&gt; These contain descriptive attributes (e.g., Customers, Products, Stores) and surround the fact table.&lt;br&gt;
This structure allows for "write once, use many" efficiency. When a store relocates from one city to another, the analyst updates a single row in the Dimension table, rather than millions of rows in the Fact table. This model ensures that when stakeholders ask complex questions, the relationships between tables allow filters to flow correctly, providing accurate answers instantly.&lt;/p&gt;

&lt;h2&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%2Fqqf5itjk4rwwv86s2nh6.png" alt="The Star Schema" width="510" height="422"&gt;
&lt;/h2&gt;

&lt;h2&gt;
  
  
  3. The Engine of Analysis: DAX Measures and Logic
&lt;/h2&gt;

&lt;p&gt;Once the data is structured, DAX (Data Analysis Expressions) is the language used to extract business logic. Analysts distinguish between Calculated Columns (row-by-row logic) and Measures (dynamic aggregations) to answer specific business questions.&lt;br&gt;
&lt;strong&gt;• Automating Business Logic:&lt;/strong&gt; Analysts use logical functions like IF and SWITCH to automate categorisation. For example, a nested IF statement or a SWITCH function can scan phone number prefixes (e.g., 254, 256) and automatically classify the country of origin as Kenya or Uganda.&lt;br&gt;
&lt;strong&gt;• Time Intelligence:&lt;/strong&gt; Business decisions rely heavily on historical context. Using time intelligence functions like DATEADD and SAMEPERIODLASTYEAR inside a CALCULATE function, analysts can generate metrics like "Revenue Last Month" or "Revenue Last Year”. This shifts the context of the data, allowing a manager to instantly see if performance is trending up or down compared to previous periods without manual recalculation.&lt;br&gt;
&lt;strong&gt;• Handling Complexity:&lt;/strong&gt; Advanced iterators like SUMX allow for calculations that require row-by-row evaluation before aggregating, such as multiplying yield by market price for every single transaction to get a precise total revenue.&lt;/p&gt;




&lt;h2&gt;
  
  
  4. Visualising the Story: From Grids to Insights
&lt;/h2&gt;

&lt;p&gt;A dashboard is not just a collection of charts; it is a tool for decision-making. Analysts select specific visuals to answer specific questions, ensuring the report is intuitive for non-technical stakeholders.&lt;br&gt;
&lt;strong&gt;• Trends and Comparisons:&lt;/strong&gt; To show how revenue evolves over time, analysts use Line Charts or Area Charts, which emphasise volume and trends. For comparing categories, such as revenue by county, Column Charts (vertical) or Bar Charts (horizontal) are used.&lt;br&gt;
&lt;strong&gt;• Correlations:&lt;/strong&gt; To test hypotheses, such as "Does higher profit correlate with higher revenue?", analysts use Scatter Charts. If the bubbles trend upward, it indicates a positive correlation, validating the business strategy.&lt;br&gt;
&lt;strong&gt;• Managing High-Volume Data:&lt;/strong&gt; When dealing with many categories (e.g., revenue by county and then by crop type), standard pie charts become cluttered. Analysts use Tree Maps or Decomposition Trees to visualise hierarchies and drill down into the data to understand exactly why a number is high or low.&lt;/p&gt;




&lt;h2&gt;
  
  
  5. The Executive View: The Dashboard
&lt;/h2&gt;

&lt;p&gt;The final output is the Dashboard—a one-page summary designed to answer the most important questions at a glance.&lt;br&gt;
&lt;strong&gt;• Immediate Health Checks:&lt;/strong&gt; Critical numbers (Total Profit, Total Yield) are placed at the top using KPI Cards or Multi-row Cards. This ensures that decision-makers see the most vital metrics immediately.&lt;br&gt;
&lt;strong&gt;• Interactivity:&lt;/strong&gt; Static reports limit discovery. Analysts add Slicers to allow users to filter the entire dashboard by specific segments, such as "County" or "Crop Type." This transforms a generic report into a tailored tool for specific regional managers.&lt;br&gt;
&lt;strong&gt;• AI-Driven Insights:&lt;/strong&gt; Tools like Q&amp;amp;A allow users to type questions in plain English (e.g., "Total yield by crop type") and receive an instant visual answer, bridging the gap between technical data models and ad-hoc business inquiries.&lt;/p&gt;

&lt;h2&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%2F71n44qyqlerajbaar85n.png" alt="Q&amp;amp;A Tool" width="782" height="331"&gt;
&lt;/h2&gt;

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

&lt;p&gt;By mastering these steps—cleaning data in Power Query, modelling with Star Schemas, calculating with DAX, and visualising in Power BI—analysts transform raw, messy data into a coherent narrative that drives real-world business action.&lt;/p&gt;

</description>
      <category>analytics</category>
      <category>data</category>
      <category>datascience</category>
      <category>microsoft</category>
    </item>
    <item>
      <title>The Blueprint of Intelligence: Mastering Data Modelling and Schemas in Power BI</title>
      <dc:creator>Jason Ndalamia</dc:creator>
      <pubDate>Sun, 01 Feb 2026 09:00:53 +0000</pubDate>
      <link>https://forem.com/jason_ndalamia/the-blueprint-of-intelligence-mastering-data-modelling-and-schemas-in-power-bi-5dhc</link>
      <guid>https://forem.com/jason_ndalamia/the-blueprint-of-intelligence-mastering-data-modelling-and-schemas-in-power-bi-5dhc</guid>
      <description>&lt;p&gt;In the realm of business analytics, creating a visually stunning dashboard is often the final step of a much deeper process. The true backbone of every successful Power BI solution is &lt;strong&gt;data modelling.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Data modelling is the process of identifying, organising, and defining the data a business collects and the relationships between them. It involves creating visual representations of data structures to ensure that reports are not only accurate but also performant and scalable. As data volumes grow, the difference between a sluggish, confusing report and a high-speed analytical tool often comes down to the quality of the underlying model. The Building Blocks: &lt;strong&gt;Fact and Dimension Tables&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;To understand how to build a model, one must first distinguish between the two types of tables that inhabit it: &lt;strong&gt;Fact tables&lt;/strong&gt; and &lt;strong&gt;Dimension tables.&lt;/strong&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  1.    Fact Tables
&lt;/h2&gt;

&lt;p&gt;A fact table is the "main table" in your model, typically containing events such as sales transactions, hospital visits, or machine readings.&lt;br&gt;
• &lt;strong&gt;Characteristics&lt;/strong&gt;: They contain &lt;strong&gt;quantitative attributes&lt;/strong&gt; (numbers) meant to be aggregated, such as "Revenue," "Yield," or "Quantity Sold".&lt;br&gt;
• &lt;strong&gt;Structure&lt;/strong&gt;: These tables are usually long and narrow. They often contain duplicate values because an event (like a specific product sale) can occur multiple times. They utilise keys (like Product ID) to link out to other tables.&lt;/p&gt;

&lt;h2&gt;
  
  
  2.    Dimension Tables
&lt;/h2&gt;

&lt;p&gt;Dimension tables contain the descriptive attributes used to slice, group, and filter the data found in fact tables.&lt;br&gt;
• &lt;strong&gt;Characteristics&lt;/strong&gt;: These tables hold information such as "Customer Name," "Product Category," or "Geographic Region".&lt;br&gt;
• &lt;strong&gt;Structure&lt;/strong&gt;: Unlike fact tables, dimension tables should contain &lt;strong&gt;unique values&lt;/strong&gt; for the entity they describe (no duplicates). They are generally wider but contain fewer rows than fact tables.&lt;/p&gt;

&lt;h1&gt;
  
  
  Schema Design: Star vs. Snowflake
&lt;/h1&gt;

&lt;p&gt;The arrangement of these tables is known as the &lt;strong&gt;schema&lt;/strong&gt;. While different designs exist, the Star Schema is universally recognised as the gold standard for Power BI. &lt;/p&gt;

&lt;h2&gt;
  
  
  The Star Schema
&lt;/h2&gt;

&lt;p&gt;In a star schema, a central fact table is surrounded by multiple dimension tables, resembling a star.&lt;br&gt;
• &lt;strong&gt;Why it is preferred:&lt;/strong&gt; The Power BI engine is optimised to work best with this structure. It reduces the number of joins required to filter data, creating a cleaner, more organised model.&lt;br&gt;
• &lt;strong&gt;Benefits:&lt;/strong&gt; It ensures DAX measures calculate faster, reports refresh more quickly, and the solution remains scalable even as data volume increases into the millions of rows.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Snowflake Schema
&lt;/h2&gt;

&lt;p&gt;The snowflake schema is a variant of the star schema where dimension tables are further normalised. In this design, dimensions branch off into other dimensions. For example, a "Product" table might link to a separate "Product Category" table, which in turn links to "Product Subcategory".&lt;br&gt;
• &lt;strong&gt;The Trade-off:&lt;/strong&gt; While this can be useful when fact tables exist at different levels of granularity (e.g., sales by product vs. targets by region), it generally adds unnecessary complexity. Extra relationships force filters to propagate through longer chains, which can negatively impact performance.&lt;/p&gt;

&lt;h2&gt;
  
  
  One Big Table (OBT)
&lt;/h2&gt;

&lt;p&gt;Beginners often attempt to flatten all data into a single table. While this may work for quick prototyping or ad-hoc analysis, it is considered a transitory state. It limits functionality—such as time intelligence and handling multiple data grains—and often leads to performance challenges due to large file sizes and repetitive data storage. &lt;/p&gt;

&lt;h3&gt;
  
  
  The Glue: Relationships
&lt;/h3&gt;

&lt;p&gt;A data model is only functional if the tables effectively talk to one another. This is achieved through relationships, which are defined by &lt;strong&gt;cardinality&lt;/strong&gt; and &lt;strong&gt;cross-filter direction.&lt;/strong&gt; &lt;/p&gt;

&lt;h3&gt;
  
  
  Cardinality
&lt;/h3&gt;

&lt;p&gt;Cardinality defines how rows in one table relate to rows in another.&lt;br&gt;
• &lt;strong&gt;One-to-Many:&lt;/strong&gt; This is the ideal relationship for linking a Dimension table (one unique ID) to a Fact table (many transactions).&lt;br&gt;
• &lt;strong&gt;Many-to-Many:&lt;/strong&gt; This relationship type is problematic and should be avoided whenever possible. It typically arises when connecting two fact tables directly or when dimensions are not unique. Misusing this can lead to "ambiguous" results, duplicated totals, and incorrect reporting.&lt;/p&gt;

&lt;h3&gt;
  
  
  Directionality
&lt;/h3&gt;

&lt;p&gt;• &lt;strong&gt;Single Direction:&lt;/strong&gt; Filters flow from the "one" side (Dimension) to the "many" side (Fact). This is the recommended setting for most scenarios.&lt;br&gt;
• &lt;strong&gt;Bi-directional (Both)&lt;/strong&gt;: This allows filters to flow in both directions. While it can solve specific problems (like filtering a slicer based on available data), it is computationally expensive and can produce unpredictable results by introducing ambiguity into the model path.&lt;/p&gt;

&lt;h1&gt;
  
  
  Why Good Modelling is Critical
&lt;/h1&gt;

&lt;p&gt;The structure of your data determines the &lt;strong&gt;performance, flexibility, and accuracy&lt;/strong&gt; of your reports.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt; &lt;strong&gt;Performance:&lt;/strong&gt; Poor modelling choices—such as relying on "One Big Table" or using complex snowflake chains—can slow down data refreshes and visual rendering. Conversely, a star schema minimises the work the engine must do, allowing reports to scale to very large datasets without lagging.&lt;/li&gt;
&lt;li&gt; &lt;strong&gt;Accuracy:&lt;/strong&gt; Bad relationships jeopardise data integrity. For instance, analysing monthly sales targets against daily sales data using a many-to-many relationship can cause targets to be duplicated across every day, leading to vastly inflated and incorrect totals. A proper model ensures aggregations (sums, averages) are calculated correctly across different contexts.&lt;/li&gt;
&lt;li&gt; &lt;strong&gt;Usability:&lt;/strong&gt; A well-designed star schema groups attributes logically (e.g., all customer details in one Customer table). This makes the "Fields" pane cleaner and easier for end-users to navigate compared to searching through a massive, flat table.&lt;/li&gt;
&lt;/ol&gt;

&lt;h1&gt;
  
  
  Conclusion
&lt;/h1&gt;

&lt;p&gt;While it is tempting to drag and drop raw data directly into visualisations, investing time in data modelling is non-negotiable for professional analysis. By adhering to the &lt;strong&gt;star schema&lt;/strong&gt;, ensuring &lt;strong&gt;one-to-many relationships&lt;/strong&gt;, and clearly distinguishing between &lt;strong&gt;facts and dimensions&lt;/strong&gt;, developers can build Power BI solutions that are robust, accurate, and lightning-fast.&lt;/p&gt;

</description>
      <category>datascience</category>
      <category>beginners</category>
      <category>analytics</category>
      <category>powerbi</category>
    </item>
    <item>
      <title>Introduction to MS Excel for Data Analytics</title>
      <dc:creator>Jason Ndalamia</dc:creator>
      <pubDate>Sun, 25 Jan 2026 16:08:49 +0000</pubDate>
      <link>https://forem.com/jason_ndalamia/introduction-to-ms-excel-for-data-analytics-26an</link>
      <guid>https://forem.com/jason_ndalamia/introduction-to-ms-excel-for-data-analytics-26an</guid>
      <description>&lt;p&gt;When people hear &lt;strong&gt;Data Analytics&lt;/strong&gt;, they often think of complex programming languages like Python or SQL. However, the functions found in Excel are generally the same ones found in Power BI, SQL, and Python—the primary difference is just the syntax used for execution.&lt;/p&gt;

&lt;p&gt;This guide will introduce you to MS Excel as a powerful analytics tool, covering everything from basic data cleaning to interactive dashboards using Pivot Tables.&lt;/p&gt;

&lt;h1&gt;
  
  
  1. Organising Your Data: Sorting and Filtering
&lt;/h1&gt;

&lt;p&gt;Before analysing data, you must ensure it is organised.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Data Sorting: Sorting involves arranging data in a specific order.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Text: Arranges data from A to Z or Z to A.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Numbers: Arranges data from smallest to largest or largest to smallest.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Dates: Arranges data from oldest to newest or newest to oldest.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
&lt;p&gt;⚠️ Important Tip: When sorting, always expand the selection when prompted. If you don't, Excel might reorder only the selected column, which will disorient the rest of your data and cause records to be mismatched.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Data Filtering allows you to temporarily display only the rows that meet specific criteria while hiding the rest. You can toggle filters on or off using the shortcut Control + Shift + L.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Text Filters: Use these to find cells that "contain" specific words or "begin with" a certain letter.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Number Filters: Use these to filter for "Top 10" items or values "Greater Than" a specific number.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Sort &amp;amp; Filter dropdown menu in the Home tab&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%2Fn1r27oifln3mgxuya7gf.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%2Fn1r27oifln3mgxuya7gf.png" alt="Sort &amp;amp; Filter dropdown menu in the Home tab" width="177" height="305"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h1&gt;
  
  
  2. Cleaning Data with Text Functions
&lt;/h1&gt;

&lt;p&gt;Raw data is often messy. Excel provides specific functions to clean and standardise text.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;TRIM: Removes extra leading or trailing spaces that are often invisible but cause errors.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;PROPER: Capitalises the first letter of each word (great for fixing names).&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;UPPER / LOWER: Converts text entirely to uppercase or lowercase.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;CONCAT: Combines two or more text strings into one cell. In older versions of Excel, you can use the &amp;amp; (ampersand) symbol to achieve this.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Messy names and a 'Cleaned' column using &lt;code&gt;=PROPER(TRIM(cell))&lt;/code&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%2Fneq20qllyu0vje0rj0jd.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%2Fneq20qllyu0vje0rj0jd.png" alt="Messy names and a 'Cleaned' column using =PROPER(TRIM(cell))" width="182" height="201"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h1&gt;
  
  
  3. Automating Decisions with Logical Functions
&lt;/h1&gt;

&lt;p&gt;Logical functions help you categorise data automatically based on rules.&lt;/p&gt;

&lt;p&gt;The IF Function The IF function performs a test: it returns one value if the test is true, and a different value if it is false.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Example: Imagine you want to categorise salaries. If the salary in cell E2 exceeds 80,000, it is "High"; otherwise, it is "Low".&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Formula: &lt;code&gt;=IF(E2 &amp;gt; 80000, "High", "Low")&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Nested IFs. If you have more than two categories (e.g., Old, Middle-aged, Young), you can use a Nested IF, which places a second IF function inside the first one.&lt;/p&gt;

&lt;p&gt;AND / OR Logic You can combine IF with AND (where both conditions must be met) or OR (where at least one condition must be met).&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;AND Example: Assign a bonus only if experience &amp;gt; 30 years AND projects &amp;gt; 10.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Formula: &lt;code&gt;=IF(AND(O2 &amp;gt; 30, P2 &amp;gt; 10), "Assign Bonus", "Do not Assign Bonus")&lt;/code&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%2F9k4z11c16nwu44f0j0mv.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%2F9k4z11c16nwu44f0j0mv.png" alt="IF formula bar and the resulting categories" width="631" height="162"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h1&gt;
  
  
  4. Connecting Data with Lookup Functions
&lt;/h1&gt;

&lt;p&gt;Data is often split across different tables. Lookup functions allow you to retrieve data from one table and pull it into another.&lt;/p&gt;

&lt;p&gt;VLOOKUP (Vertical Lookup) VLOOKUP searches for a value in the first column of a range and returns a result from a column you specify.&lt;/p&gt;

&lt;p&gt;The Syntax: &lt;code&gt;=VLOOKUP(lookup_value, table_array, col_index_num, [range_lookup])&lt;/code&gt;.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;lookup_value: The ID you are searching for.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;table_array: The range containing your data.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;col_index_num: The column number containing the answer (e.g., column 5 for Salary).&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;range_lookup: Use FALSE for an exact match, which is recommended for IDs.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;em&gt;A VLOOKUP formula connecting an Employee ID to their Salary&lt;/em&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%2Fmqcvr7lnxayadkp03kh2.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%2Fmqcvr7lnxayadkp03kh2.png" alt="A VLOOKUP formula connecting an Employee ID to their Salary" width="402" height="42"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h1&gt;
  
  
  5. Mastering Date Functions
&lt;/h1&gt;

&lt;p&gt;Excel stores dates as serial numbers, allowing for powerful calculations.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;TODAY: Returns the current date.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;NETWORKDAYS: Calculates the number of working days between two dates, automatically excluding weekends.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;DATEDIF: A "hidden" function that calculates the difference between two dates in years ("y"), months ("m"), or days.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h1&gt;
  
  
  6. The Power of Pivot Tables
&lt;/h1&gt;

&lt;p&gt;Pivot tables are the ultimate tool for summarising data. They allow you to aggregate thousands of rows into a clear summary table without writing complex formulas.&lt;/p&gt;

&lt;p&gt;How to create one:&lt;/p&gt;

&lt;p&gt;Click a single cell inside your data range (avoid selecting the whole sheet).&lt;/p&gt;

&lt;p&gt;Go to Insert &amp;gt; Pivot Table.&lt;/p&gt;

&lt;p&gt;Drag and Drop fields:&lt;/p&gt;

&lt;p&gt;Rows: For categories (e.g., Department).&lt;/p&gt;

&lt;p&gt;Values: For numbers to calculate (e.g., Sum of Salary, Count of Employees).&lt;/p&gt;

&lt;p&gt;Interactive Slicers: To make your report interactive, insert a Slicer. This is a visual button menu that filters your Pivot Table instantly when clicked.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;A Pivot Table with a Slicer for 'Department' next to it.&lt;/em&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%2Frtlcqisd5v2ecg1jh7ca.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%2Frtlcqisd5v2ecg1jh7ca.png" alt="A Pivot Table with a Slicer for 'Department' next to it" width="743" height="366"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h1&gt;
  
  
  Summary
&lt;/h1&gt;

&lt;p&gt;Excel is more than just a spreadsheet; it is a robust data analytics environment. By mastering text cleaning, logical functions, lookups, and Pivot Tables, you can transform raw data into meaningful insights.&lt;/p&gt;

</description>
      <category>beginners</category>
      <category>datascience</category>
      <category>productivity</category>
      <category>excel</category>
    </item>
    <item>
      <title>A Beginner’s Guide to Git and GitHub: From Installation to Your First Push</title>
      <dc:creator>Jason Ndalamia</dc:creator>
      <pubDate>Fri, 16 Jan 2026 12:52:05 +0000</pubDate>
      <link>https://forem.com/jason_ndalamia/a-beginners-guide-to-git-and-github-from-installation-to-your-first-push-418l</link>
      <guid>https://forem.com/jason_ndalamia/a-beginners-guide-to-git-and-github-from-installation-to-your-first-push-418l</guid>
      <description>&lt;p&gt;Starting my journey in &lt;strong&gt;Data Science, Analysis, and AI at LUXDevHQ&lt;/strong&gt; felt like learning a new language while trying to build a house. One of the most important tools I’ve discovered along the way is &lt;strong&gt;Version Control&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;In this guide, I’ll walk you through:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Setting up Git Bash
&lt;/li&gt;
&lt;li&gt;Connecting Git to GitHub
&lt;/li&gt;
&lt;li&gt;Mastering essential &lt;strong&gt;push&lt;/strong&gt; and &lt;strong&gt;pull&lt;/strong&gt; commands
&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  1. What Is Git and Why Does It Matter?
&lt;/h2&gt;

&lt;p&gt;Git is a &lt;strong&gt;Version Control System (VCS)&lt;/strong&gt;. Think of it as a &lt;em&gt;save-point system&lt;/em&gt; for your code.&lt;/p&gt;

&lt;h3&gt;
  
  
  Why is Git important?
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;⏪ Time Travel&lt;/strong&gt; – If you break your code, you can roll back to a version that worked.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;🤝 Collaboration&lt;/strong&gt; – Multiple people can work on the same project without overwriting each other’s work.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;🧪 Experimentation&lt;/strong&gt; – You can create &lt;em&gt;branches&lt;/em&gt; to try new features without affecting the main project.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  2. Setting Up Your Environment
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Step A: Install Git Bash
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;Go to &lt;a href="https://git-scm.com" rel="noopener noreferrer"&gt;Git&lt;/a&gt; and download Git for your OS (I used Windows).&lt;/li&gt;
&lt;li&gt;Run the installer.
&amp;gt; 💡 &lt;em&gt;Pro tip:&lt;/em&gt; You can keep the default settings for most options.&lt;/li&gt;
&lt;li&gt;After installation, search for &lt;strong&gt;Git Bash&lt;/strong&gt; in your applications. It looks like a terminal window.&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  Step B: Configure Your Identity
&lt;/h3&gt;

&lt;p&gt;To let GitHub know who is uploading code, configure your global Git settings:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git config &lt;span class="nt"&gt;--global&lt;/span&gt; user.name &lt;span class="s2"&gt;"Your Name"&lt;/span&gt;
git config &lt;span class="nt"&gt;--global&lt;/span&gt; user.email your-email@example.com
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  3. Secure Your Connection: Setting Up SSH Keys
&lt;/h2&gt;

&lt;p&gt;Using SSH is the professional standard. It’s more secure and saves you from typing your password every time you push code.&lt;/p&gt;

&lt;h3&gt;
  
  
  Step 1: Generate Your SSH Key
&lt;/h3&gt;

&lt;p&gt;Open Git Bash and enter (replace with your GitHub email):&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;ssh-keygen &lt;span class="nt"&gt;-t&lt;/span&gt; ed25519 &lt;span class="nt"&gt;-C&lt;/span&gt; your_email@example.com
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;• File Location: Press Enter to use the default location.&lt;br&gt;
• Passphrase: As a beginner, I left this empty for convenience.&lt;/p&gt;
&lt;h3&gt;
  
  
  Step 2: Add Key to the SSH Agent
&lt;/h3&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;eval&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="si"&gt;$(&lt;/span&gt;ssh-agent &lt;span class="nt"&gt;-s&lt;/span&gt;&lt;span class="si"&gt;)&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;
ssh-add ~/.ssh/id_ed25519
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;h3&gt;
  
  
  Step 3: Add the Public Key to GitHub
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt; Copy the key:
&lt;/li&gt;
&lt;/ol&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;cat&lt;/span&gt; ~/.ssh/id_ed25519.pub 
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;ol&gt;
&lt;li&gt;&lt;p&gt;Go to GitHub: Settings → SSH and GPG keys → New SSH Key.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Give it a name (e.g., "My Learning Laptop") and paste your key into the "Key" box.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;h3&gt;
  
  
  Step 4: Test the Connection
&lt;/h3&gt;

&lt;p&gt;Run:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;ssh &lt;span class="nt"&gt;-T&lt;/span&gt; git@github.com
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Success Check! If you see "Hi [YourUsername]! You've successfully authenticated", you are ready!&lt;/p&gt;




&lt;h2&gt;
  
  
  4. Navigating and Creating Your Project
&lt;/h2&gt;

&lt;p&gt;Learning to navigate via Git Bash makes you much faster than using a mouse! Use these commands to create your first repository:&lt;br&gt;
• Check Location: &lt;strong&gt;pwd&lt;/strong&gt; (Print Working Directory).&lt;br&gt;
• Go to Desktop: &lt;strong&gt;cd Desktop&lt;/strong&gt;&lt;br&gt;
• Create Folder: &lt;strong&gt;mkdir my-first-repo&lt;/strong&gt;&lt;br&gt;
• Enter Folder: &lt;strong&gt;cd my-first-repo&lt;/strong&gt;&lt;/p&gt;


&lt;h2&gt;
  
  
  5. Tracking Changes (The Core Workflow)
&lt;/h2&gt;

&lt;p&gt;Before sending code to GitHub, Git needs to "track" it locally. Run these inside your project folder:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt; Initialize Git: &lt;strong&gt;git init&lt;/strong&gt; (Starts tracking the folder).&lt;/li&gt;
&lt;li&gt; Check Status: &lt;strong&gt;git status&lt;/strong&gt; (See what files Git notices).&lt;/li&gt;
&lt;li&gt; Add Files: &lt;strong&gt;git add .&lt;/strong&gt; (Stages all changes to be saved).&lt;/li&gt;
&lt;li&gt; Commit: &lt;strong&gt;git commit -m "My first commit"&lt;/strong&gt; (Creates the "save point").&lt;/li&gt;
&lt;/ol&gt;


&lt;h2&gt;
  
  
  6. Pushing Code to GitHub
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Pushing&lt;/strong&gt; sends your local save points to the cloud.&lt;/p&gt;
&lt;h3&gt;
  
  
  Step A: Create the Repository on GitHub.com
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt; Log into GitHub, click the + icon → New repository.&lt;/li&gt;
&lt;li&gt; Name it (e.g., my-first-project) and keep it Public.&lt;/li&gt;
&lt;li&gt; Important: Leave "Add a README" unchecked to avoid conflicts.&lt;/li&gt;
&lt;li&gt; Click Create repository.&lt;/li&gt;
&lt;/ol&gt;
&lt;h3&gt;
  
  
  Step B: Connect and Push
&lt;/h3&gt;

&lt;p&gt;On the GitHub setup page, click SSH and copy the URL. Then run these commands one by one:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git remote add origin git@github.com:your-username/repo-name.git
git push &lt;span class="nt"&gt;-u&lt;/span&gt; origin main
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  7. Pulling Code from GitHub
&lt;/h2&gt;

&lt;p&gt;If you work on a different computer, use Pull to download the latest updates from the cloud:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git pull origin main
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  📚 Resources to Keep Learning
&lt;/h2&gt;

&lt;p&gt;• &lt;a href="https://git-scm.com/doc" rel="noopener noreferrer"&gt;Official Git Documentation&lt;/a&gt;&lt;br&gt;
• &lt;a href="https://skills.github.com/" rel="noopener noreferrer"&gt;GitHub Skills: Interactive Courses&lt;/a&gt;&lt;br&gt;
• &lt;a href="https://learngitbranching.js.org/" rel="noopener noreferrer"&gt;Visualizing Git Commands (Game)&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Conclusion: Congratulations! You've just set up a professional dev workflow. Git can be tricky at first, but keep practicing and it will become second nature. If you ran into any issues, drop a comment below and let's help each other out!
&lt;/h2&gt;

</description>
      <category>beginners</category>
      <category>learning</category>
      <category>git</category>
    </item>
  </channel>
</rss>
