<?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: Philip Saidi</title>
    <description>The latest articles on DEV Community by Philip Saidi (@saks_007).</description>
    <link>https://dev.to/saks_007</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%2F4070921%2Fcc298991-3623-407c-a5ad-065b33cd52fa.png</url>
      <title>DEV Community: Philip Saidi</title>
      <link>https://dev.to/saks_007</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/saks_007"/>
    <language>en</language>
    <item>
      <title>SQL Joins, CTEs, Subqueries, and Window Functions: A Practical Guide</title>
      <dc:creator>Philip Saidi</dc:creator>
      <pubDate>Tue, 20 Oct 2026 13:05:36 +0000</pubDate>
      <link>https://dev.to/saks_007/sql-joins-ctes-subqueries-and-window-functions-a-practical-guide-528m</link>
      <guid>https://dev.to/saks_007/sql-joins-ctes-subqueries-and-window-functions-a-practical-guide-528m</guid>
      <description>&lt;h1&gt;
  
  
  INTRODUCTION
&lt;/h1&gt;

&lt;p&gt;This article covers four techniques which are  joins to combine tables, subqueries to break questions into stages, CTEs to keep those stages readable, and window functions to rank and compare rows without losing detail. Each comes with practical examples so you can start using them right away.&lt;/p&gt;

&lt;h2&gt;
  
  
  SQL JOINS
&lt;/h2&gt;

&lt;p&gt;Joins are used to combine data from two or more tables based on a related column.&lt;br&gt;
It helps in :&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Matching records using common columns.&lt;/li&gt;
&lt;li&gt;Improving data analysis by combining related information.&lt;/li&gt;
&lt;li&gt;Creating meaningful result sets from separate tables.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;
  
  
  Types of SQL Joins
&lt;/h3&gt;

&lt;p&gt;These are categorized into different types based on rows from two tables are matched and combined.&lt;br&gt;
Consider the doctors and  visits tables share a column &lt;em&gt;doctor_id.&lt;/em&gt;&lt;/p&gt;
&lt;h4&gt;
  
  
  INNER JOIN
&lt;/h4&gt;

&lt;p&gt;Also called &lt;strong&gt;JOIN&lt;/strong&gt;&lt;br&gt;
Used to retrieve rows where matching values exist in both tables.&lt;br&gt;
Inner joins helps in:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Combining records based on related column.&lt;/li&gt;
&lt;li&gt;Returning only matching rows from both tables.&lt;/li&gt;
&lt;li&gt;Excluding non-matching data from the result set.&lt;/li&gt;
&lt;li&gt;Ensuring accurate data relationships between tables.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Figure below shows inner join&lt;/p&gt;

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

&lt;p&gt;&lt;code&gt;select tableA.column1, tableA.column2, tableB.column1&lt;br&gt;
from tableA as A&lt;br&gt;
INNER JOIN tableB as B&lt;br&gt;
ON A.matching_column = B.matching_column;&lt;/code&gt;&lt;br&gt;
Example on the hospital data&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="o"&gt;*&lt;/span&gt; 
&lt;span class="k"&gt;FROM&lt;/span&gt; &lt;span class="n"&gt;doctors&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;visits&lt;/span&gt;
&lt;span class="k"&gt;ON&lt;/span&gt; &lt;span class="n"&gt;doctors&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;doctor_id&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;visits&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;doctor_id&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&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%2Fzytqwghyz7eb3q8kvi3d.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%2Fzytqwghyz7eb3q8kvi3d.png" alt=" " width="627" height="189"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Output of inner join query&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fq5vooegdw2vlnpr0u4uo.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%2Fq5vooegdw2vlnpr0u4uo.png" alt=" " width="800" height="584"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h4&gt;
  
  
  LEFT JOIN
&lt;/h4&gt;

&lt;p&gt;Also called &lt;em&gt;LEFT OUTER JOIN&lt;/em&gt;.&lt;br&gt;
Used to retrieve all rows from the left table and matching rows from the right table.&lt;br&gt;
Useeful in :&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Returning all records from the left table.&lt;/li&gt;
&lt;li&gt;Showing matching data from the right table.&lt;/li&gt;
&lt;li&gt;Displays NULL values where no match exists.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Figure shows left join&lt;/p&gt;

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

&lt;p&gt;Example using the hospital data doctors table and visits table&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;SELECT * 
FROM doctors
LEFT JOIN visits
   ON doctors.doctor_id = visits.doctor_id;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&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%2F20fks1jbwpng08w6hcrt.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%2F20fks1jbwpng08w6hcrt.png" alt=" " width="606" height="297"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Left Join Output&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%2Fsw33ev49cy5ia2wqdc60.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%2Fsw33ev49cy5ia2wqdc60.png" alt=" " width="800" height="182"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h4&gt;
  
  
  RIGHT JOIN
&lt;/h4&gt;

&lt;p&gt;Also called RIGHT OUTER JOIN&lt;br&gt;
Used to retrieve all rows from the right table and matching rows from the left table.&lt;br&gt;
Useful in:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Returning all records from the right side table.&lt;/li&gt;
&lt;li&gt;Showing matching data from the left side table.&lt;/li&gt;
&lt;li&gt;Displays NULL values where no match exists in left table.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Figure show Right Join&lt;/p&gt;

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

&lt;p&gt;Example using hospital dataset&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;SELECT patient_id, 
       patient_name, 
       visit_id
FROM patients as p
RIGHT JOIN visits as v
ON p.patient_id = v.patient_id;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&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%2Fj6lkqw9zzrj6sn1ijope.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%2Fj6lkqw9zzrj6sn1ijope.png" alt=" " width="496" height="166"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Output of a Right Join&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%2Fmw6goaz4034zeb5ffj2z.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%2Fmw6goaz4034zeb5ffj2z.png" alt=" " width="676" height="268"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h4&gt;
  
  
  FULL JOIN
&lt;/h4&gt;

&lt;p&gt;Used to combine the results of both left join and right join.&lt;br&gt;
Helps in :&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Returning all rows from both tables.&lt;/li&gt;
&lt;li&gt;Showing matching records from each table.&lt;/li&gt;
&lt;li&gt;Displays NULL values where no match exists in either table.&lt;/li&gt;
&lt;li&gt;Provides complete data from both sides of the Join.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Figure shows Full Join&lt;/p&gt;

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

&lt;p&gt;Example using hospital visits&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;SELECT * 
FROM patients
FULL JOIN visits
ON patients.patient_id = visits.patient_id;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&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%2F0t4yvnsukdth7hb9807z.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%2F0t4yvnsukdth7hb9807z.png" alt=" " width="556" height="91"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Output of a Full Join&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%2Fl9fwxzrzvpy7furihuz5.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%2Fl9fwxzrzvpy7furihuz5.png" alt=" " width="800" height="466"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h4&gt;
  
  
  NATURAL JOIN
&lt;/h4&gt;

&lt;p&gt;Combines two tables based on columns that have same name and compatible data types.&lt;br&gt;
Returns only rows where the values in the common columns match.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Joins tables using common columns with same name.&lt;/li&gt;
&lt;li&gt;Returns only rows where values in those columns match.&lt;/li&gt;
&lt;li&gt;The common column appears only once in the result.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Example using hospital data&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;SELECT patient_id, 
       patient_name, 
       visit_id, 
       visit_date
FROM patients
NATURAL JOIN visits;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&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%2Focqd3ufzuc25adgysz7u.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%2Focqd3ufzuc25adgysz7u.png" alt=" " width="319" height="151"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Output of a Natural Join&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%2Fnhwalp4qq11knl0snuad.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%2Fnhwalp4qq11knl0snuad.png" alt=" " width="800" height="258"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  SQL COMMON TABLE EXPRESSIONS(CTEs)
&lt;/h3&gt;

&lt;p&gt;Common table expressions are a temporary set in SQL that you can reference within a single query.&lt;br&gt;
CTEs simplify complex queries, makes them easier to read and can be reused multiple times within the same query.&lt;/p&gt;

&lt;p&gt;CTEs are used for:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Performing recursive operations.&lt;/li&gt;
&lt;li&gt;Breaking down multi-step calculations into manageable parts.&lt;/li&gt;
&lt;li&gt;Replacing nested subqueries in complex data retrieval tasks. &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Consider the visits from the hospital visits table, lets find the average total_bill by insurance provider using &lt;br&gt;
a CTE.&lt;/p&gt;

&lt;p&gt;syntax&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;WITH avg_bill_by_insurance_provider AS
    (SELECT insurance_provider, AVG(total_bill) AS avg_bill
FROM visits
GROUP BY insurance_provider)
SELECT * 
FROM avg_bill_by_insurance_provider;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&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%2Fddgzdclqpxra4erwg249.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%2Fddgzdclqpxra4erwg249.png" alt=" " width="685" height="189"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Output of CTE&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%2Fixqg4ees9tckbmmzgydq.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%2Fixqg4ees9tckbmmzgydq.png" alt=" " width="510" height="259"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;WITH clause defines a CTE named avg_bill_by_insurance_provider.&lt;br&gt;
The main query references this CTE to retrieve the average bill for each insurance provider.&lt;/p&gt;

&lt;p&gt;syntax of a cte shown below&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;WITH cte_name as 
(SELECT query)
SELECT * 
FROM cte_name;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;em&gt;cte_name&lt;/em&gt; is a unique name for the CTE expression.&lt;br&gt;
&lt;em&gt;query _is a valid SQL query that returns a result set, which will be treated as a virtual table within the main query.&lt;br&gt;
_select&lt;/em&gt; is the main query that can reference the CTE by it's name.&lt;/p&gt;
&lt;h4&gt;
  
  
  USES OF CTEs
&lt;/h4&gt;

&lt;p&gt;Helps simplify and organize complex SQL queries.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Breaks complex queries into small, reusable parts.&lt;/li&gt;
&lt;li&gt;Makes queries easier to read and understand.&lt;/li&gt;
&lt;li&gt;Helps work with hierarchial data using recursion.&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;
  
  
  LIMITATIONS
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;Temporary : A CTE works only while the query runs, then it disappears.&lt;/li&gt;
&lt;li&gt;Performance: On a very large data, CTEs can be slower if reused many times.&lt;/li&gt;
&lt;li&gt;Restrictions : Some databases limit using CTEs with INSERT, UPDATE or DELETE.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;
  
  
  SQL SUBQUERIES
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Subquery&lt;/strong&gt; is a query nested inside another SQL query.&lt;br&gt;
It allows complex filtering, aggregation and data manipulation by using the result of one query inside another.&lt;br&gt;
It is essential when we need to perform operations like:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Apply Aggregate functions like SUM, COUNT, AVG dynamically.&lt;/li&gt;
&lt;li&gt;Update data using values from other tables.&lt;/li&gt;
&lt;li&gt;Delete rows based on conditions returned by another query. 
Example in the visit table to calculate the average total_bill of all patients.
&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;SELECT * FROM visits
WHERE total_bill &amp;gt; (SELECT AVG(total_bill) FROM visits);
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&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%2Fj4l67vio7m94lht2gd6x.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%2Fj4l67vio7m94lht2gd6x.png" alt=" " width="709" height="72"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Subquery Output&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%2Fsnnru86qs9kse3pb7txg.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%2Fsnnru86qs9kse3pb7txg.png" alt=" " width="403" height="406"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The main query returns only the patients whose total_bill is higher than the average.&lt;/p&gt;

&lt;p&gt;SQL clauses for Subqueries&lt;br&gt;
&lt;em&gt;WHERE _: Filters rows in the outer query based the results returned.&lt;br&gt;
_HAVING&lt;/em&gt; : Filters grouped/ Aggregated results using values produced by Having clause.&lt;/p&gt;
&lt;h4&gt;
  
  
  Types of Subqueries
&lt;/h4&gt;
&lt;h5&gt;
  
  
  Single-Row Subqueries
&lt;/h5&gt;

&lt;p&gt;A single-row subquery returns only one value as output.&lt;br&gt;
Returns exactly one row as the result.&lt;br&gt;
Commonly used with comparison operators such as =, &amp;gt;, &amp;lt;&lt;br&gt;
.&lt;/p&gt;

&lt;p&gt;Example using the patients table to find the oldest patient in the hospital visits data.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;SELECT * 
FROM patients
WHERE patient_age = (SELECT MAX(patient_age) FROM patients);
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&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%2F24g7zfyofvgdehnkodt7.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%2F24g7zfyofvgdehnkodt7.png" alt=" " width="762" height="103"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Single row Subquery Output&lt;br&gt;
The query returns the patient age whose age matches that of max value.&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%2F8n4wo7mznoe3sytr6221.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%2F8n4wo7mznoe3sytr6221.png" alt=" " width="797" height="50"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h5&gt;
  
  
  Multi-Row Subquery
&lt;/h5&gt;

&lt;ul&gt;
&lt;li&gt;Returns more than one value.&lt;/li&gt;
&lt;li&gt;Returns multiple rows as result.&lt;/li&gt;
&lt;li&gt;Requires operators that handle multiple values such as IN, ANY or ALL.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Example using doctors and visits table in the hospital visits data to find doctors located in Kisumu city.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;SELECT * 
FROM visits
WHERE doctor_id IN(
SELECT doctor_id FROM doctors WHERE  city = 'Kisumu');
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&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%2Fnt5xb6s30x6pohhwg60g.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%2Fnt5xb6s30x6pohhwg60g.png" alt=" " width="607" height="126"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Output&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%2Fjhjgutcf45tn7t98fjgo.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%2Fjhjgutcf45tn7t98fjgo.png" alt=" " width="277" height="570"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h5&gt;
  
  
  Correlated Subquery
&lt;/h5&gt;

&lt;p&gt;This depends on the outer query for its value.&lt;br&gt;
It's a dependant query it references columns from the outer query.&lt;br&gt;
Executed once for each row of the outer query making it slower for large datasets.&lt;/p&gt;
&lt;h4&gt;
  
  
  Examples of using subqueries with clauses
&lt;/h4&gt;
&lt;h5&gt;
  
  
  Fetching Data Using Subquery in WHERE Clause
&lt;/h5&gt;

&lt;p&gt;This example uses a subquery in the WHERE clause. The inner query finds doctor_id of doctors who were paid in 'Cash' in the visits table and the outer query displays their details from the doctor table.&lt;/p&gt;

&lt;p&gt;Query&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fqlhcjn3khy4ygm1sa5di.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%2Fqlhcjn3khy4ygm1sa5di.png" alt=" " width="625" height="154"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Output&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%2Fp3l591ivma07no8yew9p.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%2Fp3l591ivma07no8yew9p.png" alt=" " width="469" height="223"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;CTE vs. Subqueries&lt;/strong&gt;&lt;br&gt;
| Feature                 | CTE                                      | Subquery                                  |&lt;br&gt;
|-------------------------|------------------------------------------|-------------------------------------------|&lt;br&gt;
| Referencing             | Can be referenced multiple times         | Typically used once                       |&lt;br&gt;
| Readability             | Improves readability for complex queries | Can become difficult to read when nested  |&lt;br&gt;
| Efficiency              | Optimized for multiple references        | May be less efficient for repeated operations |&lt;/p&gt;
&lt;h3&gt;
  
  
  WINDOW FUNCTIONS
&lt;/h3&gt;

&lt;p&gt;These Functions allows performing calculations across a set of rows that are related to the current row, without collapsing the result into a single value.&lt;/p&gt;

&lt;p&gt;Commonly used for tasks like:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Aggregation&lt;/li&gt;
&lt;li&gt;Ranking&lt;/li&gt;
&lt;li&gt;Running totals&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Uses &lt;strong&gt;OVER&lt;/strong&gt; clause, which defines the 'Window' of rows for the calculation.&lt;/p&gt;

&lt;p&gt;Window Function contains:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;PARTITION BY _ This divides the data into groups using partition by.&lt;/li&gt;
&lt;li&gt;ORDER BY _ Specifies the order of rows within each group using order by.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Functions like SUM(), AVG(), ROW NUMBER(), RANK(), and DENSE RANK() can be applied in a controlled way in window functions.&lt;/p&gt;

&lt;p&gt;syntax&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;SELECT column_name1, 
    Window_function(column_name2)
OVER([PARTITION BY column_name3]
[ORDER BY column_name4]) AS new_column
FROM table_name;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;code&gt;Window_function - Function used for calculation or ranking&lt;br&gt;
column_name1 - column to display&lt;br&gt;
column_name2 - Function column&lt;br&gt;
column_name3 - PARTITION BY column&lt;br&gt;
column_name4 - ORDER BY column&lt;br&gt;
new_column - result alias&lt;br&gt;
table_name - source table&lt;/code&gt;&lt;/p&gt;
&lt;h4&gt;
  
  
  Types of Window Functions
&lt;/h4&gt;

&lt;p&gt;There are two types namely:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Aggregate window functions.&lt;/li&gt;
&lt;li&gt;Ranking window functions.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Examples using the hospital data.&lt;/p&gt;
&lt;h5&gt;
  
  
  Aggregate window functions.
&lt;/h5&gt;

&lt;p&gt;Calculates aggregates over a window of rows while retaining individual rows.&lt;br&gt;
These are:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;SUM() - sums values within a window.&lt;/li&gt;
&lt;li&gt;AVG() - calculates the mean of numbers.&lt;/li&gt;
&lt;li&gt;COUNT() - counts the rows.&lt;/li&gt;
&lt;li&gt;MAX() - returns the highest value.&lt;/li&gt;
&lt;li&gt;MIN() - returns the least value.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Using AVG(), to calculate average total_bill within each insurance provider in the visits table.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;SELECT insurance_provider, total_bill, 
   AVG(total_bill) OVER (PARTITION BY insurance_provider) as average_totalbill
FROM visits;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&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%2Fyghmde1qtmbheo27mxgm.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%2Fyghmde1qtmbheo27mxgm.png" alt=" " width="799" height="152"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Output&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%2F7aro5m4wogg98z0vheos.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%2F7aro5m4wogg98z0vheos.png" alt=" " width="763" height="702"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h5&gt;
  
  
  Ranking window functions.
&lt;/h5&gt;

&lt;p&gt;Provides rankings of rows within a partition based on a specific criteria.&lt;br&gt;
Ranking functions includes:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;RANK() - assigns ranks to rows, skips ranks for duplicates.&lt;/li&gt;
&lt;li&gt;DENSE RANK() - assigns ranks to rows, with duplicates included.&lt;/li&gt;
&lt;li&gt;ROW NUMBER() - assigns a unique number to each row in the result set.&lt;/li&gt;
&lt;li&gt;PERCENT RANK() - shows relative rank of a row as percentage between 0 and 1.&lt;/li&gt;
&lt;/ul&gt;

&lt;h6&gt;
  
  
  RANK()
&lt;/h6&gt;

&lt;p&gt;Used to assign ranks to rows within a group based on a specific order&lt;br&gt;
Commonly used to organize and analyze data.&lt;br&gt;
Using RANK(), we will rank doctors by city.&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%2Fr3tgj921t65rqedrjc8u.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%2Fr3tgj921t65rqedrjc8u.png" alt=" " width="688" height="180"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Output&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%2Fn4d4x9onkz5rzv29p8zl.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%2Fn4d4x9onkz5rzv29p8zl.png" alt=" " width="800" height="282"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h4&gt;
  
  
  Fixing Window functions issues
&lt;/h4&gt;

&lt;p&gt;When using window functions certain issues like slow performance can be avoided by:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Partioning carefully - without partition by the whole table is treated as one group.&lt;/li&gt;
&lt;li&gt;Check order by - it controls the calculation order in the window.&lt;/li&gt;
&lt;li&gt;Optmise performance - on large datasets window functions might be slower, use indexes if needed.&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>sql</category>
      <category>datascience</category>
      <category>postgres</category>
      <category>beginners</category>
    </item>
    <item>
      <title>JCARS LOGISTICS DATA ANALYSIS: FROM RAW DATA TO INTERACTIVE POWERBI BUSINESS INSIGHTS.</title>
      <dc:creator>Philip Saidi</dc:creator>
      <pubDate>Tue, 29 Sep 2026 17:20:31 +0000</pubDate>
      <link>https://dev.to/saks_007/jcars-logistics-data-analysis-from-raw-data-to-interactive-powerbi-business-insights-f4d</link>
      <guid>https://dev.to/saks_007/jcars-logistics-data-analysis-from-raw-data-to-interactive-powerbi-business-insights-f4d</guid>
      <description>&lt;h1&gt;
  
  
  INTRODUCTION
&lt;/h1&gt;

&lt;p&gt;JCars Logistics imports, sells, and delivers vehicles to customers across different regions in Kenya. The company collects information about its sales transactions, vehicles, customers,&lt;br&gt;
branches, sales representatives, payments, deliveries, logistics costs, returns, cancellations, and customer experiences. Management would like to use this information to better understand how the business is performing and identify areas that require attention.&lt;/p&gt;
&lt;h1&gt;
  
  
  TOOLS USED FOR THIS DATASET
&lt;/h1&gt;

&lt;ul&gt;
&lt;li&gt;PowerQuery for cleaning the dataset.&lt;/li&gt;
&lt;li&gt;PowerBI for Modelling, Relationships, Visualization,  and Dashboard.&lt;/li&gt;
&lt;/ul&gt;
&lt;h1&gt;
  
  
  DATA OVERVIEW
&lt;/h1&gt;
&lt;h2&gt;
  
  
  Step one: Understand the data before you build
&lt;/h2&gt;

&lt;p&gt;&lt;em&gt;Grain&lt;/em&gt; of the data what each &lt;em&gt;row&lt;/em&gt; and _column _represents.&lt;br&gt;
I then sorted the columns into groups: transaction, customer, geography, people and channel, vehicle, money, status and experience.&lt;br&gt;
The dataset had 277 rows and 32 columns.&lt;br&gt;
Columns were named column 1 to column 32 each representing different data as shown below:&lt;br&gt;
&lt;code&gt;OrderID, Order date, Delivery date, customer name, age, type, Region, county, city, branch, sales rep, lead, car details, units sold, selling price, Discount, revenue recorded, delivery fee, logistic fee, customer rating, review count and returned&lt;/code&gt;&lt;br&gt;
The loaded data shown below&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%2Fn4gebqxuh7konp2f5svt.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%2Fn4gebqxuh7konp2f5svt.png" alt=" " width="800" height="420"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h1&gt;
  
  
  DATA QUALITY
&lt;/h1&gt;

&lt;p&gt;The most important step in data analysis.&lt;br&gt;
This helps in discovering data quality issues.&lt;br&gt;
After loading the data in powerBI here are some of the issues found:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The Order ID was not an ID. There were five prefix styles &lt;code&gt;(LC1000, LCL-1001, ORD1004, ord1020, CAR1086), 19 blanks or N/A, and three numbers used twice&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Dates were in six formats. &lt;code&gt;Some were numbers (46066), 
some 26-Mar-25, some Aug 29, 2025, and four were 2026-13-04, which is year-day-month. Worst were the 47 slash dates like 03/04/2026, which are valid as both 3 April and 4 March&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Categories exploded. &lt;code&gt;Toyota appeared as Toyota, TOYOTA, Toyta, Totoya, Toyota Kenya. In total, Car Make had 62 spellings for 10 real car makes. Sales reps had 80 "names" for 10 people, including Dan1el Kimani, where a digit 1 had replaced the letter i.&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Discounts came in over 50 different spellings. &lt;code&gt;7%, 0.07, 7, 7 percent, ten percent, No Discount, #ERROR.&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Numbers were formatted as text as shown below.&lt;/li&gt;
&lt;li&gt;Five columns held money: price, unit cost, delivery fee, logistics cost, and recorded revenue. They mixed &lt;code&gt;KSh, KES, plain numbers, $, USD, EUR, ZAR, R, a ?, and an M suffix (9.14M)&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Customer names, Region, Branch, City were not in proper case and inconsistent spellings like &lt;code&gt;COUNTY GOVERMENT, Msa, Nkr, Faith ACHIENG&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Numerical values that held monetary values had negative values like &lt;code&gt;-22,738,440&lt;/code&gt; and customer rating of &lt;code&gt;-1&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Customer Age as text.&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%2Fododwpn6umytoj9armdz.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%2Fododwpn6umytoj9armdz.png" alt=" " width="184" height="183"&gt;&lt;/a&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%2F6bkqte4vi89bn54woebq.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%2F6bkqte4vi89bn54woebq.png" alt=" " width="247" height="525"&gt;&lt;/a&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%2Fou58sgxfao4akibvxf4e.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%2Fou58sgxfao4akibvxf4e.png" alt=" " width="235" height="310"&gt;&lt;/a&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%2Fvasmiwuo5lu27o6la5w0.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%2Fvasmiwuo5lu27o6la5w0.png" alt=" " width="207" height="45"&gt;&lt;/a&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%2Fzbjd0s8zg26icqfixluj.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%2Fzbjd0s8zg26icqfixluj.png" alt=" " width="472" height="385"&gt;&lt;/a&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%2Fs6afvn2k1k4n49559h7n.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%2Fs6afvn2k1k4n49559h7n.png" alt=" " width="800" height="361"&gt;&lt;/a&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%2F98966afuw8wrrmafgxpp.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%2F98966afuw8wrrmafgxpp.png" alt=" " width="178" height="309"&gt;&lt;/a&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%2Ffu4o7d9icz9ibbi11bz3.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%2Ffu4o7d9icz9ibbi11bz3.png" alt=" " width="244" height="411"&gt;&lt;/a&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%2Fy0si95vswokp7gceqriy.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%2Fy0si95vswokp7gceqriy.png" alt=" " width="800" height="400"&gt;&lt;/a&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%2Fv02l8razzfv2cex4zhye.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%2Fv02l8razzfv2cex4zhye.png" alt=" " width="193" height="30"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h1&gt;
  
  
  DATA CLEANING
&lt;/h1&gt;

&lt;p&gt;After identifying the data quality issues, I hit transform data.&lt;br&gt;
First step I categorized according to:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Customer details&lt;/li&gt;
&lt;li&gt;Location details&lt;/li&gt;
&lt;li&gt;Currency details&lt;/li&gt;
&lt;li&gt;Payment details&lt;/li&gt;
&lt;li&gt;Customer rating&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;First and foremost I made first rows as headers (promoted headers) as shown below&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%2Fuvi8yh5hvsyz5uaif40s.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%2Fuvi8yh5hvsyz5uaif40s.png" alt=" " width="800" height="421"&gt;&lt;/a&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%2F1ah641iu4ju466bdb7ad.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%2F1ah641iu4ju466bdb7ad.png" alt=" " width="799" height="466"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;
  
  
  Customer, sales rep details cleaning
&lt;/h2&gt;

&lt;p&gt;Here I cleaned the customer name, customer type and age&lt;br&gt;
Customer names were in improper case as shown below&lt;br&gt;
&lt;code&gt;Select the customer name column -&amp;gt; Rightclick-&amp;gt; Transform-&amp;gt; Capitalize each word -&amp;gt;OK&lt;/code&gt;&lt;br&gt;
The Age I changed from text format to wholenumber type by&lt;br&gt;
&lt;code&gt;Selecting customer age -&amp;gt; Rightclick -&amp;gt; Change type -&amp;gt; Wholenumber -&amp;gt; OK&lt;/code&gt;&lt;br&gt;
Sales rep had Improper case too, I transformed to proper case and used Replace values with the inconsistent words like &lt;code&gt;Dan1el to Daniel&lt;/code&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%2F7xvabjtm34wraem3iqke.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%2F7xvabjtm34wraem3iqke.png" alt=" " width="235" height="310"&gt;&lt;/a&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%2Fw6c886r4melpy03l3a5b.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%2Fw6c886r4melpy03l3a5b.png" alt=" " width="207" height="45"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;
  
  
  Location data quality issues
&lt;/h2&gt;

&lt;p&gt;I cleaned includes city names like &lt;code&gt;Nkr changed to Nakuru, Msa to Mombasa, Eldo to Eldoret&lt;/code&gt; by replacing values &lt;code&gt;Selecting column -&amp;gt; Right click -&amp;gt; Replace values -&amp;gt; Write the value to be replaced and value to replace with (Msa -&amp;gt; Mombasa )-&amp;gt;OK&lt;/code&gt;&lt;br&gt;
Then changed to proper case by &lt;code&gt;Transform -&amp;gt; Capitalize each word -&amp;gt;OK&lt;/code&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%2F6so3n2icn6749kstoai6.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%2F6so3n2icn6749kstoai6.png" alt=" " width="800" height="361"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;
  
  
  Currency
&lt;/h2&gt;

&lt;p&gt;Currency was to be standardized to KES or Ksh.&lt;br&gt;
Currency was in &lt;em&gt;USD or $, EURO, ?&lt;/em&gt; assumed as &lt;em&gt;EURO and ZAR/R.&lt;/em&gt;&lt;br&gt;
I used &lt;code&gt;1USD = 129.35, 1EURO = 147.15 and 1ZAR = 7.8.&lt;/code&gt;&lt;br&gt;
I changed the values to fixed decimal numbers in the rows affected holding monetary values like Revenue, Delivery fee, Logistics fee, Unit selling price and others.&lt;br&gt;
The negative values I assumed they were whole and changed them to a positive number.&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%2Fi0sldtsuwn1t5f3nv11m.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%2Fi0sldtsuwn1t5f3nv11m.png" alt=" " width="184" height="183"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;
  
  
  Date column
&lt;/h2&gt;

&lt;p&gt;This contains delivery date and order date.&lt;br&gt;
Date was in serial numbers like 4648, mixed date formats as text.&lt;br&gt;
I changed the format to date format and Removed errors.&lt;/p&gt;
&lt;h2&gt;
  
  
  Payment methods and Customer rating
&lt;/h2&gt;

&lt;p&gt;The issues with payment methods was improper case, names were mispelled.&lt;br&gt;
I used Replace values with correct spelled words.&lt;br&gt;
Customer rating was in words , I used Replace values  with the correct values like &lt;code&gt;4.5 out of 5 with 4.5&lt;/code&gt;.&lt;/p&gt;
&lt;h1&gt;
  
  
  DATA MODELLING
&lt;/h1&gt;

&lt;p&gt;After cleaning I had one Flat table.&lt;br&gt;
To start modelling process, I had to categorize the Flat table into separate Dimension table and one Fact table.&lt;br&gt;
I categorized according to each components of the table namely:&lt;br&gt;
I used duplication of the flat table into 8 tables and removed columns one by one until I got the required details for each.&lt;/p&gt;
&lt;h3&gt;
  
  
  Dim_customer
&lt;/h3&gt;

&lt;p&gt;This will hold all customer details like:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Customer name&lt;/li&gt;
&lt;li&gt;Customer age&lt;/li&gt;
&lt;li&gt;Customer ID&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%2Fzg5rko826m9ijdqx8kvh.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%2Fzg5rko826m9ijdqx8kvh.png" alt=" " width="763" height="820"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h3&gt;
  
  
  Sales representative
&lt;/h3&gt;

&lt;p&gt;This will hold the sales rep details:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Sales rep name&lt;/li&gt;
&lt;li&gt;Lead source&lt;/li&gt;
&lt;li&gt;Sales_rep ID&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%2Feak6tl3drux0yotmfjxo.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%2Feak6tl3drux0yotmfjxo.png" alt=" " width="699" height="864"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h3&gt;
  
  
  Order status
&lt;/h3&gt;

&lt;p&gt;This represents order and delivery status:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Delivery status&lt;/li&gt;
&lt;li&gt;Order status&lt;/li&gt;
&lt;li&gt;Status ID&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%2Fz74ad3lqz4bzet607bob.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%2Fz74ad3lqz4bzet607bob.png" alt=" " width="777" height="802"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h3&gt;
  
  
  Dim_location
&lt;/h3&gt;

&lt;p&gt;Contains the location details like:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Branch&lt;/li&gt;
&lt;li&gt;Region&lt;/li&gt;
&lt;li&gt;County&lt;/li&gt;
&lt;li&gt;City&lt;/li&gt;
&lt;li&gt;Location ID&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%2Frrlkqjmd13p0mbzjs4zq.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%2Frrlkqjmd13p0mbzjs4zq.png" alt=" " width="708" height="402"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h3&gt;
  
  
  Payment method
&lt;/h3&gt;

&lt;p&gt;Represents payment methods used:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Payment method&lt;/li&gt;
&lt;li&gt;Payment ID&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%2Fb2fgnngd0xu7bb88kqj6.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%2Fb2fgnngd0xu7bb88kqj6.png" alt=" " width="421" height="408"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h3&gt;
  
  
  Dim_date
&lt;/h3&gt;

&lt;p&gt;Represents the dates for time series analysis.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Delivery date&lt;/li&gt;
&lt;li&gt;Order date&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%2Fgps5yymdp1em03dgj8cu.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%2Fgps5yymdp1em03dgj8cu.png" alt=" " width="570" height="832"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h3&gt;
  
  
  Dim_car
&lt;/h3&gt;

&lt;p&gt;Represents the car details:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Car make&lt;/li&gt;
&lt;li&gt;Vehicle&lt;/li&gt;
&lt;li&gt;Fuel type&lt;/li&gt;
&lt;li&gt;Transmission&lt;/li&gt;
&lt;li&gt;Color&lt;/li&gt;
&lt;li&gt;Car model&lt;/li&gt;
&lt;li&gt;Vehicle year&lt;/li&gt;
&lt;li&gt;Car ID&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%2Fe814x0p0htogdlyl4g95.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%2Fe814x0p0htogdlyl4g95.png" alt=" " width="800" height="576"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h3&gt;
  
  
  Dim_Fact_table
&lt;/h3&gt;

&lt;p&gt;This contains all numeric values and all foreign keys.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Customer rating&lt;/li&gt;
&lt;li&gt;Revenue recorded&lt;/li&gt;
&lt;li&gt;Delivery fee&lt;/li&gt;
&lt;li&gt;Logistic fee&lt;/li&gt;
&lt;li&gt;Units sold&lt;/li&gt;
&lt;li&gt;Unit selling price&lt;/li&gt;
&lt;li&gt;Primary key (OrderID)&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%2Fwhrjp2jf5s4udt9uq61r.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%2Fwhrjp2jf5s4udt9uq61r.png" alt=" " width="799" height="370"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;After categorizing the tables into dimtables and one fact table, I checked for duplication by &lt;code&gt;Select the column -&amp;gt; Remove duplicates -&amp;gt; OK&lt;/code&gt;&lt;br&gt;
Then I added an index column by &lt;code&gt;Selecting the table -&amp;gt; add index column -&amp;gt; Choose from 1 -&amp;gt; OK and rename accodring to the table created&lt;/code&gt;.&lt;br&gt;
I closed and applied for loading in PowerBI for creating relationships.&lt;/p&gt;
&lt;h1&gt;
  
  
  RELATIONSHIPS
&lt;/h1&gt;

&lt;p&gt;Data is loaded to PowerBI.&lt;br&gt;
To establish relationships, I used the Primary keys in the Dimension tables to Foreign keys in the jcars_fact_table.&lt;br&gt;
The cardinality used is one to many because is the required standard in star schema approach, with a Filter direction of single , and made the relationship active.&lt;br&gt;
The relationships was represented by a star schema, with one fact table at the centre with an active relation with all the dimension tables as shown below.&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%2Fc8y2bo6q6zoz8428hglu.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%2Fc8y2bo6q6zoz8428hglu.png" alt=" " width="800" height="427"&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%2Ffpaan1xghlxhm57wrvng.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%2Ffpaan1xghlxhm57wrvng.png" alt=" " width="800" height="440"&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%2Fo5prxyf0e4r8ftg3hpyk.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%2Fo5prxyf0e4r8ftg3hpyk.png" alt=" " width="800" height="414"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h1&gt;
  
  
  DAX MEASURES
&lt;/h1&gt;

&lt;p&gt;I created some important DAX measures to represent the Business performance.&lt;br&gt;
&lt;code&gt;Select column jcars_fact_table -&amp;gt; Create a new measure -&amp;gt; Write the formule example Total revenue =SUM(Revenue recorded) -&amp;gt; Enter&lt;/code&gt;&lt;br&gt;
To display the measure go to &lt;code&gt;Report view -&amp;gt; Select a card visual -&amp;gt; Look for the created measure in the jcars_fact_table -&amp;gt; click on it -&amp;gt; The measure will be displayed on the card&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F28jdnynkqtm9erf0gzwq.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%2F28jdnynkqtm9erf0gzwq.png" alt=" " width="800" height="238"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h3&gt;
  
  
  DAX MEASURES CREATED
&lt;/h3&gt;

&lt;p&gt;These are some of the DAX measures I created.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Revenue = sum(jcars_fact_table[Revenue Recorded])
Total cost of units sold = SUMX(jcars_fact_table,jcars_fact_table[Unit Cost] * jcars_fact_table[Units Sold])
Total cars sold = sum(jcars_fact_table[Units Sold])
Gross Margin % = DIVIDE([Gross Profit],[Revenue], 0)
Gross Profit = [Revenue] - [Total cost of units sold]
Average Customer rating = AVERAGE(jcars_fact_table[Customer Rating])
Total Transcations = COUNTA(jcars_fact_table[Order ID])
Unpaid Revenue = CALCULATE([Revenue],dim_order_status[Payment Status] IN {"Pending", "Partially Paid", "Unpaid"})
Return Rate % = DIVIDE(CALCULATE([All Orders], dim_order_status[Returned] = "Y"), CALCULATE([All Orders], dim_order_status[Returned] = "Unknown"))
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h1&gt;
  
  
  DASHBOARD
&lt;/h1&gt;

&lt;p&gt;I created my dashboards with DAX measures as my Key Performance Indicators namely:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Revenue&lt;/li&gt;
&lt;li&gt;Gross Profit&lt;/li&gt;
&lt;li&gt;Gross margin&lt;/li&gt;
&lt;li&gt;Return Rate&lt;/li&gt;
&lt;li&gt;Unpaid Rate&lt;/li&gt;
&lt;li&gt;Units sold&lt;/li&gt;
&lt;li&gt;Total transcations made
I also included Slicers for Customer type and Regions for Interactivity, with Visuals as shown below.&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%2Fzztywwm2yl4p0u2kkj9z.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%2Fzztywwm2yl4p0u2kkj9z.png" alt=" " width="800" height="365"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h1&gt;
  
  
  BUSINESS INSIGHTS
&lt;/h1&gt;

&lt;h4&gt;
  
  
  What the data said
&lt;/h4&gt;

&lt;p&gt;Headline: KSh 408.6M revenue, 128 vehicles, KSh 7.8M gross profit, 0.02 gross margin. &lt;br&gt;
More Findings:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;More Discounts does not mean more units sold.
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csvs"&gt;&lt;code&gt;&lt;span class="k"&gt;Discount&lt;/span&gt;    &lt;span class="k"&gt;Units&lt;/span&gt; &lt;span class="k"&gt;sold&lt;/span&gt;  &lt;span class="k"&gt;Gross&lt;/span&gt; &lt;span class="k"&gt;margin&lt;/span&gt;
&lt;span class="mf"&gt;0&lt;/span&gt;&lt;span class="err"&gt;–&lt;/span&gt;&lt;span class="mf"&gt;3&lt;/span&gt;&lt;span class="err"&gt;%&lt;/span&gt;          &lt;span class="mf"&gt;1&lt;/span&gt;            &lt;span class="mf"&gt;16.0&lt;/span&gt; &lt;span class="err"&gt;%&lt;/span&gt; 
&lt;span class="k"&gt;over&lt;/span&gt; &lt;span class="mf"&gt;3&lt;/span&gt;&lt;span class="err"&gt;-&lt;/span&gt;&lt;span class="mf"&gt;5&lt;/span&gt;&lt;span class="err"&gt;%&lt;/span&gt;   &lt;span class="mf"&gt;5&lt;/span&gt;            &lt;span class="mf"&gt;49.0&lt;/span&gt; &lt;span class="err"&gt;%&lt;/span&gt; 
&lt;span class="k"&gt;over&lt;/span&gt; &lt;span class="mf"&gt;5&lt;/span&gt;&lt;span class="err"&gt;-&lt;/span&gt;&lt;span class="mf"&gt;7&lt;/span&gt;&lt;span class="err"&gt;%&lt;/span&gt;   &lt;span class="mf"&gt;7&lt;/span&gt;            &lt;span class="mf"&gt;12.0&lt;/span&gt;&lt;span class="err"&gt;%&lt;/span&gt;  
&lt;span class="k"&gt;over&lt;/span&gt; &lt;span class="mf"&gt;7&lt;/span&gt;&lt;span class="err"&gt;-&lt;/span&gt;&lt;span class="mf"&gt;10&lt;/span&gt;&lt;span class="err"&gt;%&lt;/span&gt;      &lt;span class="mf"&gt;1&lt;/span&gt;                &lt;span class="mf"&gt;14.0&lt;/span&gt;&lt;span class="err"&gt;%&lt;/span&gt;
&lt;span class="k"&gt;over&lt;/span&gt; &lt;span class="mf"&gt;10&lt;/span&gt;&lt;span class="err"&gt;-&lt;/span&gt;&lt;span class="mf"&gt;15&lt;/span&gt;&lt;span class="err"&gt;%&lt;/span&gt; &lt;span class="mf"&gt;1&lt;/span&gt;            &lt;span class="mf"&gt;2.0&lt;/span&gt;&lt;span class="err"&gt;%&lt;/span&gt;   
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ol&gt;
&lt;li&gt;&lt;p&gt;Revenue is up margin is down&lt;br&gt;
Quarterly gross margin slid from 15.0% (Q1 2025) to -3.0% (Q2 2026) while Q4 2026 revenue hit a period high of KSh 49.2M, with a gross margin of 53.0%.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Athi River Branch had the highest Revenue of 53.9M and a gross margin of 49.0%, with least is Kakamega Branch with a Revenue of 1.9M and a gross margin of -1.0%.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Volume is not value in lead sources.&lt;/strong&gt; Whatsapp is the biggest revenue source (KSh 65.8M) but earns 36.0% margin, with 9 units sold and Walk-in had 16.2M revenue with a negative margin of -17%, selling 11 units.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;24% of active revenue (≈ KSh 96.33M) is Pending ,  Partially Paid or Unpaid.&lt;/strong&gt; The exposure is spread across every customer type (NGO and Corporate each ≈ KSh 64.81M), so it is a process issue, not one bad customer.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Toyota and SUVs dominate, and customer types differ sharply in margin.&lt;/strong&gt; Toyota is 8% of revenue and SUVs 15%%, which is strong but a concentration risk. Dealers earn the best margin (14.0%) while NGOs, at 16% of revenue. Cash and Wire deals earn 30.0% against  24% for RTGS and  Cash.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Customer ratings are not linked to revenue.&lt;/strong&gt; Correlation of rating with order revenue is −0.08, and the average rating is 3.6 out of 5 for every customer type (3.56–3.62). customer satisfaction is not a function of deal size or customer type.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  CHALLENGES AND LESSONS LEARNED
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;PowerQuery  issues&lt;/strong&gt; with performance and ran slower.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Discovering that the delivery fee sits inside recorded revenue&lt;/strong&gt; changed the profit definition. Testing a formula against a recorded column paid off more than any single cleaning step.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Recorded values are not automatically right.&lt;/strong&gt; The recorded revenue column was less reliable than a recalculation from its own components.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Lesson:&lt;/strong&gt; understand the business meaning of each field before modelling. Most of the value came from questions asked &lt;em&gt;before&lt;/em&gt; touching a visual.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  ASSUMPTIONS
&lt;/h2&gt;

&lt;p&gt;The currency column the figures which were in EURO and ? were all marked as EURO.&lt;br&gt;
Recorded Revunue has Delivery calculated in it.&lt;/p&gt;

&lt;h1&gt;
  
  
  CONCLUSION
&lt;/h1&gt;

&lt;h2&gt;
  
  
  Recommendations
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Review Thika's pricing and discounting&lt;/strong&gt; before scaling it.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Shift lead-generation effort toward Instagram and Referral&lt;/strong&gt;, and review how Phone Call leads are handled.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Set collection targets and ageing reports&lt;/strong&gt;, and start capturing payment dates.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Define "Returned"&lt;/strong&gt; and record return date, reason and refund value.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Fix data entry at the source&lt;/strong&gt; with dropdowns, currency and date validation, and real Order IDs. Cleaning once does not stop the mess coming back.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  What I learned
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Test formulas against recorded values.&lt;/strong&gt; Finding that the delivery fee sits inside revenue came from a validation check, not from a cleaning step, and it changed the whole profit definition.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Certainty has limits.&lt;/strong&gt; Ambiguous dates cannot be resolved perfectly. A documented rule plus a flag beats a silent guess.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Excluding data has a cost.&lt;/strong&gt; Showing the 68% coverage next to the KPIs is more honest than a clean-looking number.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Questions come before visuals.&lt;/strong&gt; Most of the value came before I dragged a single chart onto the canvas.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Code, data, model and the full data-quality log are in the:&lt;a href="https://github.com/saks-saidi/Jcars_PowerBI_Project" rel="noopener noreferrer"&gt;Github&lt;/a&gt;&lt;/p&gt;

</description>
      <category>powerquery</category>
      <category>powerbitools</category>
      <category>datascience</category>
      <category>data</category>
    </item>
    <item>
      <title>DATA MODELLING 101 IN POWERBI</title>
      <dc:creator>Philip Saidi</dc:creator>
      <pubDate>Wed, 16 Sep 2026 03:58:48 +0000</pubDate>
      <link>https://dev.to/saks_007/data-modelling-101-in-powerbi-58dj</link>
      <guid>https://dev.to/saks_007/data-modelling-101-in-powerbi-58dj</guid>
      <description>&lt;h1&gt;
  
  
  WHAT IS DATA MODELLING IN POWERBI.
&lt;/h1&gt;

&lt;p&gt;It's a process of setting up tables, relationships, calculations and access for data analysis scenarios.&lt;br&gt;
Data modelling also define the data structure of single or many tables and there relationships.&lt;br&gt;
A well defined model delivers fast performance, accurate results, simple DAX, and an intuitive experience for data analysts.&lt;br&gt;
This topic will cover the essential principles of data modelling in PowerBI, with strong focus on recommended &lt;strong&gt;star schema, relationships and joins(both in PowerQuery and data model&lt;/strong&gt;).&lt;/p&gt;

&lt;h2&gt;
  
  
  Why Data Modelling matters.
&lt;/h2&gt;

&lt;p&gt;Good modelling delivers:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Faster query performance and lower memory consumption.&lt;/li&gt;
&lt;li&gt;Simple and more reliable DAX.&lt;/li&gt;
&lt;li&gt;Easier maintenance and scalability.&lt;/li&gt;
&lt;li&gt;Better usage for business us&lt;/li&gt;
&lt;/ul&gt;

&lt;h1&gt;
  
  
  Model Schemas
&lt;/h1&gt;

&lt;p&gt;We will focus on two types of schemas:&lt;/p&gt;

&lt;h2&gt;
  
  
  Star schema
&lt;/h2&gt;

&lt;p&gt;The data model in this schema demonstrates the relationship between one fact table and many different dimension tables.&lt;br&gt;
Figure below shows components of star schema.&lt;/p&gt;

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

&lt;p&gt;&lt;strong&gt;Fact Table&lt;/strong&gt;:&lt;br&gt;
The fact table sits at the center of the schema and stores the measurable, quantitative data used for analysis. Examples include:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Sales amount&lt;/li&gt;
&lt;li&gt;Units sold&lt;/li&gt;
&lt;li&gt;Discount&lt;/li&gt;
&lt;li&gt;Profit
Each record in a fact table represents a business event (e.g sales transcation).&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Dimension Tables:&lt;/strong&gt;&lt;br&gt;
Dimension tables surround the fact table and contain descriptive attributes that add context to the facts. Common dimensions include:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Product details&lt;/li&gt;
&lt;li&gt;Customer details&lt;/li&gt;
&lt;li&gt;Time attributes&lt;/li&gt;
&lt;li&gt;Employee or store information
These tables allow users to slice, dice, filter, and group the fact data for analysis (e.g., sales by region, by month, by product category).&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Features of Star schema.
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Fact table contains numeric measures.&lt;/li&gt;
&lt;li&gt;Dimension table storing descriptive attributes.&lt;/li&gt;
&lt;li&gt;High query performance.&lt;/li&gt;
&lt;li&gt;Easy to understand, even for non-technical users.&lt;/li&gt;
&lt;li&gt;Allows fast joins and simple queries.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Example of a star schema:(sample-chocolate-sales-data-all)
&lt;/h3&gt;

&lt;p&gt;To demonstrate how a star schema works, consider a sample chocolate  data where each shipments details is stored in a fact table and is analyzed through sorrounding dimension tables.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F42265m4stne58dze73j5.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%2F42265m4stne58dze73j5.png" alt=" " width="800" height="388"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Shipments fact table contains numeric measures such as amount, boxes along with foreign keys to each dimension such as product id, geographical id and sales person id.&lt;/li&gt;
&lt;li&gt;Sorrounding dimension tables provide descriptive attributes that allow the facts to be examined from different perspectives.&lt;/li&gt;
&lt;li&gt;Locations dimensions describes the shipment location and product dimensions describes the product being shipped.&lt;/li&gt;
&lt;li&gt;Calendar dimension shows the date in years, months the product was shipped.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Advantages of a Star schema
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Easier to perform simple queries.&lt;/li&gt;
&lt;li&gt;Simplified business reporting logically.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Disadvantages of a Star schema
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Denormalized data can introduce duplicates.&lt;/li&gt;
&lt;li&gt;Not as adaptable as normalized models when analysis needs change frequently.&lt;/li&gt;
&lt;li&gt;Weak support for many to many relationships.&lt;/li&gt;
&lt;/ul&gt;

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

&lt;p&gt;Is data model technique where dimension tables are normalized into multiple related sub-tables.&lt;br&gt;
The snowflake schema applies only to dimension tables, not the fact table.&lt;br&gt;
Figure shows the snowflake schema.&lt;/p&gt;

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

&lt;ul&gt;
&lt;li&gt;Dimension tables are normalized into multiple related tables, creating a hierarchial structure.&lt;/li&gt;
&lt;li&gt;Fact table is still located at the center of the schema, surrounded by dimension tables.&lt;/li&gt;
&lt;li&gt;Each dimension table is further broken down into multiple related tables.
&lt;em&gt;&lt;strong&gt;Example&lt;/strong&gt;&lt;/em&gt;: A customer dimension may contain a cityID that links to a separate city dimension tables storing city, state, country.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Features of a Snowflake Schema
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Uses normalized tables to reduce redundancy and improve consistency.&lt;/li&gt;
&lt;li&gt;Are built around a central fact table with connected dimension tables.&lt;/li&gt;
&lt;li&gt;Dimensions can be split into multiple levels, allowing detailed analysis.&lt;/li&gt;
&lt;li&gt;Requires more joins which can slow performance on large datasets.
-Scales well for large data, but its complexity makes it harder to manage.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Example of Snowflake schema.&lt;/p&gt;

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

&lt;ul&gt;
&lt;li&gt;Employee diemnsion includes atrributes like employeeID, Name, DepartmentID, Region, and Territory.DepartmentID links to the department table, which holds department details like Nmae and location.&lt;/li&gt;
&lt;/ul&gt;

&lt;h4&gt;
  
  
  Advantages
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;Improves data integrity through normalization.&lt;/li&gt;
&lt;li&gt;Reduces redundancy and storage usage.&lt;/li&gt;
&lt;li&gt;Supports detailed hierarchical drill-down.&lt;/li&gt;
&lt;/ul&gt;

&lt;h4&gt;
  
  
  Disadvantages
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;Increased schema complexity.&lt;/li&gt;
&lt;li&gt;More joins, leading to slower query performance.&lt;/li&gt;
&lt;li&gt;Normalization may offer minimal storage savings compared to the entire warehouse.&lt;/li&gt;
&lt;li&gt;Not recommended unless the hierarchy is essential and widely used in queries.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Difference Between Snowflake and Star Schema
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Feature             Star schema      Snowflake schema
Dimension structure- Denormalized     - Normalized
Query performance -Faster(few joins) -Slower(more joins) 
Storage requirement- Higher          - Lower
Complexity         - Simple          - More complex
Use case - Simple analytics      - Complex hierarchies.



&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  What are Table Relationships?
&lt;/h2&gt;

&lt;p&gt;A relationship described between two or more tables via a common attribute is termed a table relationship. It is very crucial as it enables users to access data from two separate tables with ease.&lt;/p&gt;

&lt;h3&gt;
  
  
  Types of Table Relationships
&lt;/h3&gt;

&lt;p&gt;There are four types of table relationships&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;em&gt;One-to-One (1:1)&lt;/em&gt;: One row in a table that can only link to one row in another table.&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%2F2awlo5s2cnvxm8n2oxmy.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%2F2awlo5s2cnvxm8n2oxmy.png" alt=" " width="604" height="179"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;em&gt;One-to-Many (1:*)&lt;/em&gt;: One row matching to many rows in another table.&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%2Fim3t2dw0s3ueam1pgb0r.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%2Fim3t2dw0s3ueam1pgb0r.png" alt=" " width="630" height="193"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;em&gt;Many-to-One (*:1)&lt;/em&gt;: Many rows in a table, matching one unique row in another table.&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%2Flv02q1qvvgh56nsp98wz.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%2Flv02q1qvvgh56nsp98wz.png" alt=" " width="619" height="246"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;em&gt;Many-to-Many (&lt;em&gt;:&lt;/em&gt;)&lt;/em&gt;: Multiple rows that can link into multiple rows in another table.&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%2F8ekygzwqj9fol5dhnlzx.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%2F8ekygzwqj9fol5dhnlzx.png" alt=" " width="609" height="216"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Cross filter direction
&lt;/h3&gt;

&lt;p&gt;Cross filter considers the columns from both the tables that join them together and allows the user to tell the direction of filtering allowed.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Single: It represents a single direction filter. In this filtering choices in connected tables work on the table where values are being aggregated.&lt;/li&gt;
&lt;li&gt;Both: It represents a bi-directional filter. In this, for filtering both tables connected are considered as one single table.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  We need to identify key fields for Relationships
&lt;/h3&gt;

&lt;p&gt;A table relationship works by matching key fields.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;They can be fields with the same name in both fact and dimension tables.&lt;/li&gt;
&lt;li&gt;Mostly we use the primary key of one table as a foreign key in another table and helps in establishing a relationship between two tables.
&lt;strong&gt;&lt;em&gt;Example&lt;/em&gt;&lt;/strong&gt;: Table below shows primary keys like GeographicalID in the location table.&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%2Fb8fkdvzrna8nichjbtgw.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%2Fb8fkdvzrna8nichjbtgw.png" alt=" " width="799" height="380"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Impact of table relationships in powerBI
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Incorrectly defined table relationships can lead to performance issues, such as slow query execution.&lt;/li&gt;
&lt;li&gt;Complex relationships with large datasets may result in increased memory.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  How to optimize table relationships
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Avoid unnecessary relationships.&lt;/li&gt;
&lt;li&gt;Keep the number of relationships to a minimum.&lt;/li&gt;
&lt;li&gt;Use Bi-directional filtering only when necessary.&lt;/li&gt;
&lt;li&gt;High cardinality relationships can impact performance.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Merged Tables in PowerQuery
&lt;/h2&gt;

&lt;p&gt;This merges data from two or more tables into single table by using PowerQuery.&lt;br&gt;
It's based on common columns between tables.&lt;/p&gt;

&lt;h3&gt;
  
  
  Importance of merging tables.
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Enables user to perform analysis, reporting, and visualization on combined datasets without the need for complex joins/relationships between tables.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Merging Tables using Merge queries command
&lt;/h3&gt;

&lt;p&gt;First load the data sets into powerbi as shown below:&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%2Fg3zwe036zhv0l2p66nnq.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%2Fg3zwe036zhv0l2p66nnq.png" alt=" " width="487" height="445"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;code&gt;Click on Transform data -&amp;gt; click on merge queries command&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Feubwu1gufk4vzw364r97.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%2Feubwu1gufk4vzw364r97.png" alt=" " width="800" height="154"&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%2F4oxqui1r72awttjnsrfu.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%2F4oxqui1r72awttjnsrfu.png" alt=" " width="796" height="80"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Select the left table for merge and next right table for merge.&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%2F2qojz7ywymv9ypfnwqge.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%2F2qojz7ywymv9ypfnwqge.png" alt=" " width="800" height="691"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Select type of join you want perform, the join operations are used to join the tables.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F1dlkffwcqd979yq4qvul.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%2F1dlkffwcqd979yq4qvul.png" alt=" " width="754" height="261"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Types Of Joins
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;Left outer join:- Merges all the rows from the left table and matching rows from right table.&lt;/li&gt;
&lt;li&gt;Right outer join:- Merges all the rows from the right table and matching rows from left table.&lt;/li&gt;
&lt;li&gt;Full outer join:- Merges all the rows from the both tables.&lt;/li&gt;
&lt;li&gt;Inner join:- Merges only same rows from the same tables.&lt;/li&gt;
&lt;li&gt;Left anti:- Merges only rows from left table.&lt;/li&gt;
&lt;li&gt;Right anti:- Merges only rows from right table.&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  Fuzzy Matching
&lt;/h3&gt;

&lt;p&gt;Fuzzy matching is a technique used to identify and match similar strings or text values within a dataset by measuring their similarity based on various algorithms and criteria.&lt;/p&gt;

&lt;h3&gt;
  
  
  Impact of Merged tables on performance in powerbi
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Tables can impact performance during data refresh.&lt;/li&gt;
&lt;li&gt;Large merged tables can increase data model size and memory usage thus affecting performance.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  How to make Merge queries work:
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Limit the number of transformations applied to merged tables.&lt;/li&gt;
&lt;li&gt;Apply filters and aggregations to reduce the number of rows and columns in merged tables before loading into data model.&lt;/li&gt;
&lt;/ul&gt;

&lt;h1&gt;
  
  
  CONCLUSION
&lt;/h1&gt;

&lt;p&gt;For most business intelligence work, I would consider a star schema with one-to-many relationships, single-direction filtering, and a dedicated Date dimension.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;&lt;em&gt;Star schema&lt;/em&gt;&lt;/strong&gt; is easier to perform simple queries in DAX and has simplified business reporting logically compared to a Snowflake schema which offers complex operations.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;em&gt;One to many&lt;/em&gt;&lt;/strong&gt;relationships because it keeps filter propagation predictable: dimensions filter facts, not the other way around.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;em&gt;Date table&lt;/em&gt;&lt;/strong&gt; which keeps time reporting possible for time series data analysis and reporting.&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>powerfuldevs</category>
      <category>datascience</category>
      <category>analytics</category>
    </item>
    <item>
      <title>Jumia Product Performance Dashboard: Analyzing Pricing, Discounts, and Customer Reviews</title>
      <dc:creator>Philip Saidi</dc:creator>
      <pubDate>Sun, 06 Sep 2026 13:35:06 +0000</pubDate>
      <link>https://dev.to/saks_007/jumia-product-performance-dashboard-analyzing-pricingdiscounts-and-customer-reviews-28c5</link>
      <guid>https://dev.to/saks_007/jumia-product-performance-dashboard-analyzing-pricingdiscounts-and-customer-reviews-28c5</guid>
      <description>&lt;h1&gt;
  
  
  Introduction
&lt;/h1&gt;

&lt;p&gt;The project introduces a Jumia dataset in csv file.&lt;br&gt;
Jumia is an ecommerce powerhouse operating accross Africa.&lt;br&gt;
The goal of this project is to create an interactive Excel dashboard that provides insights into the&lt;br&gt;
performance of products listed on Jumia&lt;/p&gt;
&lt;h1&gt;
  
  
  Overview
&lt;/h1&gt;

&lt;p&gt;The dataset contains information about products listed on Jumia with the following columns:&lt;br&gt;
• Product: Name of the product.&lt;br&gt;
• Current Price: The current selling price of the product (in KSh).&lt;br&gt;
• Old Price: The original price before discount (in KSh).&lt;br&gt;
• Discount: The percentage discount offered on the product.&lt;br&gt;
• Review: The number of customer reviews received by the product.&lt;br&gt;
• Rating: The average customer rating of the product (out of 5).&lt;/p&gt;
&lt;h1&gt;
  
  
  Objectives of the objectives
&lt;/h1&gt;

&lt;ul&gt;
&lt;li&gt;Identify errors in the dataset&lt;/li&gt;
&lt;li&gt;Perform data cleaning&lt;/li&gt;
&lt;li&gt;Perform analysis for trends&lt;/li&gt;
&lt;li&gt;Visualize your results using pivot charts&lt;/li&gt;
&lt;li&gt;Use slicers to interact with the indicators&lt;/li&gt;
&lt;li&gt;Create a dashboard with all the KPIs&lt;/li&gt;
&lt;/ul&gt;
&lt;h1&gt;
  
  
  Data Cleaning
&lt;/h1&gt;

&lt;p&gt;I copied and named the cleaning sheet cleaned.&lt;br&gt;
Autofitted column width to accomodate the long product names by&lt;br&gt;
 &lt;code&gt;CTRL + A -&amp;gt;Home -&amp;gt; Format -&amp;gt; Autofit column width -&amp;gt; OK&lt;/code&gt;&lt;br&gt;
Applied a filter for all the columns by &lt;code&gt;Select First Header row -&amp;gt; Home -&amp;gt; Sort and Filter -&amp;gt; Filter-&amp;gt; Apply filter -&amp;gt; OK&lt;/code&gt;&lt;br&gt;
Changed the header row background color &lt;code&gt;Select First Header row -&amp;gt; Home -&amp;gt; Fill color -&amp;gt; Select the desired color -&amp;gt; OK&lt;/code&gt; to differenciate from the main data.&lt;/p&gt;
&lt;h2&gt;
  
  
  Data Errors Identified
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Duplicates&lt;/li&gt;
&lt;li&gt;The current and old price are in text format
&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%2Fasba45gw3k6q5d6rkxhu.png" alt=" " width="577" height="48"&gt;
&lt;/li&gt;
&lt;li&gt;Rating is mispelled and in text format
&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%2Focbcxyvovaukvf139yvx.png" alt=" " width="97" height="39"&gt;
&lt;/li&gt;
&lt;li&gt;Review column is in negative number 
&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%2Finoh6r6n47vobd81oq7y.png" alt=" " width="190" height="54"&gt;
&lt;/li&gt;
&lt;li&gt;Price in a row is in range of two numbers 
&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%2Ffod70b565b25rqa9e79h.png" alt=" " width="511" height="27"&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;
  
  
  Removing duplicates
&lt;/h3&gt;

&lt;p&gt;&lt;code&gt;Select the entire data -&amp;gt; Go to data tab -&amp;gt; Remove duplicates -&amp;gt; Choose all columns -&amp;gt; OK&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fjhtw920stm4ytzvuqbuy.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%2Fjhtw920stm4ytzvuqbuy.png" alt=" " width="800" height="405"&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%2F4ucxya0i3mvnig270jkp.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%2F4ucxya0i3mvnig270jkp.png" alt=" " width="799" height="408"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h3&gt;
  
  
  Change current price and old price to currency format.
&lt;/h3&gt;

&lt;p&gt;&lt;code&gt;Select the current/old price column -&amp;gt; Use Find and replace -&amp;gt; First Replace Ksh to Blank -&amp;gt; OK -&amp;gt; Select price column -&amp;gt; Home -&amp;gt; Number -&amp;gt; Choose currency on the dropdown menu -&amp;gt; choose Ksh on the currency symbol -&amp;gt; select 1 decimal place -OK&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fkz2sbr2a7uofowitaikm.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%2Fkz2sbr2a7uofowitaikm.png" alt=" " width="800" height="406"&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%2F8dmunqmvzq0kwpyqti0f.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%2F8dmunqmvzq0kwpyqti0f.png" alt=" " width="800" height="407"&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%2F2nfefkrgs0xj1zua5zf0.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%2F2nfefkrgs0xj1zua5zf0.png" alt=" " width="800" height="411"&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%2Ff2l9b4ykwcc4afvs5lty.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%2Ff2l9b4ykwcc4afvs5lty.png" alt=" " width="800" height="410"&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%2Fvzc15nwn7wlvchn2kcoc.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%2Fvzc15nwn7wlvchn2kcoc.png" alt=" " width="799" height="405"&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%2F4t75wugujma0jmtpoz40.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%2F4t75wugujma0jmtpoz40.png" alt=" " width="800" height="396"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h3&gt;
  
  
  Change Rating to number format
&lt;/h3&gt;

&lt;p&gt;I used Find and replace&lt;br&gt;
&lt;code&gt;Select Rating column -&amp;gt; Home tab -&amp;gt; Find and select -&amp;gt; Replace or CTRL + H -&amp;gt; example  2.0 out 5 with 2, 2.5 out of 5 with 2.5&lt;/code&gt;&lt;br&gt;
Changed the name by renaming the Ratingd to Ratings.&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%2Fc1rauot2bp17ycwd8h25.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%2Fc1rauot2bp17ycwd8h25.png" alt=" " width="799" height="422"&gt;&lt;/a&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%2F7mzyhak6f20i6j5xejng.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%2F7mzyhak6f20i6j5xejng.png" alt=" " width="800" height="422"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h3&gt;
  
  
  Change Review to a positive number
&lt;/h3&gt;

&lt;p&gt;Select the Review column&lt;br&gt;
&lt;code&gt;CTRL + H for find and replace-&amp;gt; Replace - with blank-&amp;gt; OK&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fs8alcdlts4z53gojsc7v.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%2Fs8alcdlts4z53gojsc7v.png" alt=" " width="799" height="415"&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%2Fq5q315f0fxw62hmzj9et.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%2Fq5q315f0fxw62hmzj9et.png" alt=" " width="800" height="409"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h3&gt;
  
  
  Price in a row is in range of two numbers
&lt;/h3&gt;

&lt;p&gt;I calculated the average of the two numbers in range by &lt;br&gt;
&lt;code&gt;=AVERAGE(2200,3200)&lt;/code&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%2Ftckgru6mwqd3ik07j6m6.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%2Ftckgru6mwqd3ik07j6m6.png" alt=" " width="800" height="416"&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%2F9elwpybpl5nbkkdl94d1.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%2F9elwpybpl5nbkkdl94d1.png" alt=" " width="799" height="404"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;
  
  
  Data Enrichment
&lt;/h2&gt;

&lt;p&gt;The project required we create 3 columns&lt;/p&gt;
&lt;h4&gt;
  
  
  Price category
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;High price greater ksh 3000&lt;/li&gt;
&lt;li&gt;Medium price greater or equal ksh 2000&lt;/li&gt;
&lt;li&gt;Low price less than 1000
I used a nested IF statement in the inserted column and renamed it price category.
&lt;code&gt;=IF(B2&amp;gt;3000,"High Price",IF(B2&amp;gt;=2000,"Medium Price","Low Price"))&lt;/code&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fw5840j1j1nkesbqneozz.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%2Fw5840j1j1nkesbqneozz.png" alt=" " width="238" height="75"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h4&gt;
  
  
  Discount Category
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;High discount greater than 40%&lt;/li&gt;
&lt;li&gt;Medium discount less than or equal 40%&lt;/li&gt;
&lt;li&gt;Low discount less than 20%
I use a nested ID statement and renamed the column discount category &lt;code&gt;=IF([@Discount]="","Missing",IF([@Discount]&amp;lt;20%,"Low Discount",IF([@Discount]&amp;lt;=40%,"Medium Discount","High Discount"))&lt;/code&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fieaj3rzwviewhqpxjia9.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%2Fieaj3rzwviewhqpxjia9.png" alt=" " width="192" height="79"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h4&gt;
  
  
  Rating Category
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;Excellent greater than 5&lt;/li&gt;
&lt;li&gt;Average less than or equal 4.5&lt;/li&gt;
&lt;li&gt;Poor less than 3
I used a nested IF statement here too and renamed Rating category.
&lt;code&gt;=IF([@Ratings]="","Missing",IF([@Ratings]&amp;lt;3,"Poor",IF([@Ratings]&amp;lt;=4.5,"Average","Excellent")))&lt;/code&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fo3p7likquf0wh4bxtgbr.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%2Fo3p7likquf0wh4bxtgbr.png" alt=" " width="352" height="58"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h4&gt;
  
  
  Discount Amount
&lt;/h4&gt;

&lt;p&gt;I used subtraction from old price to current price.&lt;br&gt;
Renamed the column Discount amount.&lt;br&gt;
&lt;code&gt;=[@[Old price]]-[@[Current price]]&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F52gv8vcle01iurifqygw.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%2F52gv8vcle01iurifqygw.png" alt=" " width="189" height="82"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h1&gt;
  
  
  DATA ANALYSIS USING PIVOT TABLES AND CHARTS.
&lt;/h1&gt;

&lt;p&gt;I created pivot tables to help me with data analysis and data visualization.&lt;br&gt;
From the data analysis&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%2Fkwsw6w5v5mupm621gx19.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%2Fkwsw6w5v5mupm621gx19.png" alt=" " width="519" height="312"&gt;&lt;/a&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;- Click anywhere in the data table
- Go to insert table 
- Choose pivot table
- Choose from existing table and a new worksheet
- OK
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&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%2Fb7nwhcnqv4o2zcask0l8.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%2Fb7nwhcnqv4o2zcask0l8.png" alt=" " width="800" height="415"&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%2F5ckti2z5bssyur4jki94.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%2F5ckti2z5bssyur4jki94.png" alt=" " width="800" height="399"&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%2Fl2y7lf3dbmkt5eh7ndgb.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%2Fl2y7lf3dbmkt5eh7ndgb.png" alt=" " width="799" height="427"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;I created a pie chart and a bar chart showing discount by reviews, ratings category by average reviews, price and rating using the pivot tables created. &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%2Fmpnkphhb4jd818cq8vi3.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%2Fmpnkphhb4jd818cq8vi3.png" alt=" " width="800" height="391"&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%2F4eq99sjax5vw99kvsu4e.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%2F4eq99sjax5vw99kvsu4e.png" alt=" " width="799" height="395"&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%2Fdvhuohzi6lvmch1qrl5x.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%2Fdvhuohzi6lvmch1qrl5x.png" alt=" " width="800" height="404"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h1&gt;
  
  
  Excel Dashboard
&lt;/h1&gt;

&lt;p&gt;I used these slicers to connect all the pivot tables/charts.&lt;br&gt;
&lt;code&gt;Created a pivot table -&amp;gt; Insert -&amp;gt; Slicer -&amp;gt; Choose columns (Rating category, Price category, Discount category) -&amp;gt; OK&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fi5rqq3oryuwp9ikk7qv1.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%2Fi5rqq3oryuwp9ikk7qv1.png" alt=" " width="800" height="395"&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%2F22oqb4s6i9x6g6yz5laf.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%2F22oqb4s6i9x6g6yz5laf.png" alt=" " width="800" height="421"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;From the Slicers and pivot tables/chart I created a Dashboard displaying all the charts, slicers for interaction and Key performance Indicators shown below&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%2F1ajwbfa2biqim7wfizi5.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%2F1ajwbfa2biqim7wfizi5.png" alt=" " width="799" height="346"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h1&gt;
  
  
  CONCLUSION
&lt;/h1&gt;

&lt;p&gt;From the dataset given ratings,reviews,prices and large discounts do not guarantee for huge sales.Jumia should stock product that makes a different in quality this will attract customers.&lt;/p&gt;

&lt;h1&gt;
  
  
  Here is the link to the project files for collaboration:&lt;a href="https://github.com/saks-saidi/Excel-Project" rel="noopener noreferrer"&gt;GITHUB&lt;/a&gt;
&lt;/h1&gt;

</description>
      <category>data</category>
      <category>analyst</category>
      <category>beginners</category>
      <category>datacleaning</category>
    </item>
    <item>
      <title>Getting Started with Excel for Data Analytics: From Basics to Data Cleaning.</title>
      <dc:creator>Philip Saidi</dc:creator>
      <pubDate>Sat, 29 Aug 2026 20:13:33 +0000</pubDate>
      <link>https://dev.to/saks_007/getting-started-with-excel-for-data-analytics-from-basics-to-data-cleaning-nk8</link>
      <guid>https://dev.to/saks_007/getting-started-with-excel-for-data-analytics-from-basics-to-data-cleaning-nk8</guid>
      <description>&lt;h1&gt;
  
  
  Overview
&lt;/h1&gt;

&lt;h2&gt;
  
  
  What is data and data analysis
&lt;/h2&gt;

&lt;p&gt;Data is information that helps people or business make decisions.&lt;/p&gt;

&lt;h3&gt;
  
  
  Types of data
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Text (Abcde)&lt;/li&gt;
&lt;li&gt;Numbers (12348.0)&lt;/li&gt;
&lt;li&gt;Dates (12/3/1993, 12-5-2026)&lt;/li&gt;
&lt;li&gt;Currency ($45.5, KES200.5)&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Data analysis
&lt;/h2&gt;

&lt;p&gt;The process of making data to a useful information using different tools such as Excel.&lt;br&gt;
It entails processes like&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Data formatting&lt;/li&gt;
&lt;li&gt;Data validation&lt;/li&gt;
&lt;li&gt;Data cleaning&lt;/li&gt;
&lt;li&gt;Data analysis&lt;/li&gt;
&lt;li&gt;Data visualization&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  What is Excel
&lt;/h2&gt;

&lt;p&gt;Excel is a spreadsheet application used to create, view, edit , clean, analyze and visualize data.&lt;/p&gt;

&lt;h2&gt;
  
  
  Excel use cases
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Create data or record data for reference. &lt;/li&gt;
&lt;li&gt;To record data /data entry.&lt;/li&gt;
&lt;li&gt;Data analysis and give insights.&lt;/li&gt;
&lt;li&gt;Business intelligence on light weight.&lt;/li&gt;
&lt;li&gt;Project management.&lt;/li&gt;
&lt;li&gt;Cleaning data.&lt;/li&gt;
&lt;li&gt;Create beautiful visual representation of data.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Creating data with Excel for Students grades
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Open excel application in your pc&lt;/li&gt;
&lt;li&gt;Open Blank workbook name it Students grades&lt;/li&gt;
&lt;li&gt;Save by clicking File then Save as.&lt;/li&gt;
&lt;li&gt;Choose a location to save and name the file&lt;/li&gt;
&lt;li&gt;Click on cell A1 and name it FIRSTNAME&lt;/li&gt;
&lt;li&gt;Press TAB to move to the next cell&lt;/li&gt;
&lt;li&gt;Name it LASTNAME, next QUIZ 1, QUIZ 2, QUIZ 3, and AVERAGE as shown below&lt;/li&gt;
&lt;li&gt;Autofit the columns by Clicking Home tab -&amp;gt; Format -&amp;gt; Autofit column -&amp;gt; OK.&lt;/li&gt;
&lt;li&gt;Enter the data as shown in the screenshot and save.&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%2Fkntwr3tfcuw2vz06quu7.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%2Fkntwr3tfcuw2vz06quu7.png" alt=" " width="800" height="487"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h1&gt;
  
  
  Introduction to Excel Cleaning data.
&lt;/h1&gt;

&lt;p&gt;The first step to data cleaning:&lt;/p&gt;

&lt;h3&gt;
  
  
  Sample data errors
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Wrong date format &lt;/li&gt;
&lt;li&gt;Incorrect data types&lt;/li&gt;
&lt;li&gt;Blank cells/ missing values&lt;/li&gt;
&lt;li&gt;Duplicates&lt;/li&gt;
&lt;li&gt;Wrong format of data types&lt;/li&gt;
&lt;li&gt;Missing values&lt;/li&gt;
&lt;li&gt;Incorrect information&lt;/li&gt;
&lt;/ul&gt;

&lt;h1&gt;
  
  
  Formatting data
&lt;/h1&gt;

&lt;p&gt;You can format numbers, texts, rows and columns&lt;/p&gt;

&lt;h4&gt;
  
  
  Number formatting
&lt;/h4&gt;

&lt;p&gt;Numbers always align to the right of the cell. &lt;br&gt;
Follow these steps to format numbers to desired data type&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Select the column you want to format&lt;/li&gt;
&lt;li&gt;Click Home tab/ribbon and find Number group&lt;/li&gt;
&lt;li&gt;A drop down menu will occur, choose which number format you want and click OK.&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%2Fbxs3yh3ibiqri4ei5crz.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%2Fbxs3yh3ibiqri4ei5crz.png" alt=" " width="799" height="396"&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%2Ftwbl3fy4z4znbydamaza.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%2Ftwbl3fy4z4znbydamaza.png" alt=" " width="800" height="511"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h4&gt;
  
  
  Text Formatting
&lt;/h4&gt;

&lt;p&gt;Text are a string or words like John, Lorry, HR.&lt;br&gt;
Text are aligned to the left of the cell&lt;br&gt;
Follow these steps to format texts&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Select the text you want &lt;/li&gt;
&lt;li&gt;Click Home tab&lt;/li&gt;
&lt;li&gt;Choose to color or make it bold in the font section&lt;/li&gt;
&lt;li&gt;You can change the background color and click OK.&lt;/li&gt;
&lt;li&gt;Save your work.&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%2Frbayzsquripbsdkrfk8i.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%2Frbayzsquripbsdkrfk8i.png" alt=" " width="800" height="645"&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%2Fg0496uo0cyjjqtdsc3dl.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%2Fg0496uo0cyjjqtdsc3dl.png" alt=" " width="800" height="417"&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%2Fvqxlviwcgofhkb831ewn.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%2Fvqxlviwcgofhkb831ewn.png" alt=" " width="799" height="409"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h4&gt;
  
  
  Row and Column formatting.
&lt;/h4&gt;

&lt;p&gt;Follow these steps&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Select an entire row/column example ROW 1&lt;/li&gt;
&lt;li&gt;Select Home tab and Click B to make it Bold.&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%2F7xd29q7tuwwhvaevu3mg.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%2F7xd29q7tuwwhvaevu3mg.png" alt=" " width="800" height="408"&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%2Fjy015xu03dqi2ms0oouj.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%2Fjy015xu03dqi2ms0oouj.png" alt=" " width="800" height="416"&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%2F6vquvhcwccsfwvqsa0vw.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%2F6vquvhcwccsfwvqsa0vw.png" alt=" " width="800" height="414"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Data Cleaning Using Excel
&lt;/h2&gt;

&lt;p&gt;Data cleaning is the art of formatting and correcting data so that it can be correct and accurate for use in data analysis.&lt;/p&gt;

&lt;p&gt;For this We will use a random data set from the internet called kenya-school-grades-dirty.&lt;br&gt;
Start with removing duplicates&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Select all data&lt;/li&gt;
&lt;li&gt;Go to data tab &lt;/li&gt;
&lt;li&gt;Click remove duplicates.&lt;/li&gt;
&lt;li&gt;Select the column you want&lt;/li&gt;
&lt;li&gt;Click OK.&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%2Fkv3doohopm2dgwtf1row.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%2Fkv3doohopm2dgwtf1row.png" alt=" " width="800" height="405"&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%2Fhsogczyp22ix24me5ohs.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%2Fhsogczyp22ix24me5ohs.png" alt=" " width="799" height="406"&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%2Fdoc79x9yzqmzmt7j8izt.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%2Fdoc79x9yzqmzmt7j8izt.png" alt=" " width="800" height="412"&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%2F7u7n6qtpq63sq0tmtrr3.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%2F7u7n6qtpq63sq0tmtrr3.png" alt=" " width="800" height="411"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;In the data set names are not in proper case and have spacing.&lt;br&gt;
We rectify this by:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Selecting the columns Student Name.&lt;/li&gt;
&lt;li&gt;Right click and insert a new column&lt;/li&gt;
&lt;li&gt;In the empty column write the formula =TRM(PROPER(B2:B221)) and Enter.&lt;/li&gt;
&lt;li&gt;This removes any whitespace and capitalize the first letter.&lt;/li&gt;
&lt;li&gt;Insert another cell and copy the corrected student name and delete the previous one then save.&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%2Fss1m3kddg8kyagu20azi.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%2Fss1m3kddg8kyagu20azi.png" alt=" " width="800" height="412"&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%2Fvm1lhv7f3nrbpddz34qu.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%2Fvm1lhv7f3nrbpddz34qu.png" alt=" " width="800" height="409"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;In the gender it has more than one identifier that is M, f, Female, FEMALE, MALE.&lt;br&gt;
We can correct this by removing the repeating gender by find and replace method.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Select the gender column.&lt;/li&gt;
&lt;li&gt;Select Home tab&lt;/li&gt;
&lt;li&gt;Find and select -&amp;gt; Replace&lt;/li&gt;
&lt;li&gt;A dialogue box will pop up&lt;/li&gt;
&lt;li&gt;Type what you what to find and replace all it with the correct gender.&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%2F931kmne09ebmgazwfr0x.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%2F931kmne09ebmgazwfr0x.png" alt=" " width="800" height="437"&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%2F1gpxlwkfpvazplu020kw.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%2F1gpxlwkfpvazplu020kw.png" alt=" " width="800" height="433"&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%2F8dkdpuzymsxhz71s9kkw.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%2F8dkdpuzymsxhz71s9kkw.png" alt=" " width="800" height="415"&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%2F8b85a3rz58523fsap2lp.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%2F8b85a3rz58523fsap2lp.png" alt=" " width="799" height="407"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Date format&lt;br&gt;
In the last column the date format is inconsistent&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Select column you want to format(Date recorded)&lt;/li&gt;
&lt;li&gt;Go to Home tab&lt;/li&gt;
&lt;li&gt;Then Click Number group&lt;/li&gt;
&lt;li&gt;Scroll to date&lt;/li&gt;
&lt;li&gt;Select the date format that is correct.&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%2F71jl4kuegtd8lzldwsdu.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%2F71jl4kuegtd8lzldwsdu.png" alt=" " width="799" height="407"&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%2Fs9la7ztzy81u61945leu.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%2Fs9la7ztzy81u61945leu.png" alt=" " width="799" height="417"&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%2F9d66wuyx70lnn3crumja.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%2F9d66wuyx70lnn3crumja.png" alt=" " width="799" height="417"&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%2Fwvtthwdxu6msk9ywf675.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%2Fwvtthwdxu6msk9ywf675.png" alt=" " width="800" height="435"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h4&gt;
  
  
  Data validation
&lt;/h4&gt;

&lt;p&gt;Restricting users on what is allowed to be entered in a given column.&lt;br&gt;
Follow these steps:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Select column you want to validate.&lt;/li&gt;
&lt;li&gt;Click on data ribbon&lt;/li&gt;
&lt;li&gt;Data validation group&lt;/li&gt;
&lt;li&gt;Choose list&lt;/li&gt;
&lt;li&gt;Type the data that you want to be allowed in that column&lt;/li&gt;
&lt;li&gt;Click OK.&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%2Fwrx31al6tbhkfambvbgj.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%2Fwrx31al6tbhkfambvbgj.png" alt=" " width="800" height="416"&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%2Fcl5vih1rsy624xutgpts.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%2Fcl5vih1rsy624xutgpts.png" alt=" " width="800" height="410"&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%2Fr0rcwes52nxig9lsxrhq.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%2Fr0rcwes52nxig9lsxrhq.png" alt=" " width="800" height="430"&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%2F2og1e1b0tn4glv0cipwe.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%2F2og1e1b0tn4glv0cipwe.png" alt=" " width="800" height="430"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h1&gt;
  
  
  CONCLUSION
&lt;/h1&gt;

&lt;p&gt;Excel is important in both data analysis, cleaning and visualization.&lt;/p&gt;

</description>
      <category>beginners</category>
      <category>datascience</category>
    </item>
    <item>
      <title># MY FIRST GITHUB PROJECT: FROM A LOCAL FOLDER TO GITHUB USING GIT AND SSH.</title>
      <dc:creator>Philip Saidi</dc:creator>
      <pubDate>Sat, 22 Aug 2026 08:37:21 +0000</pubDate>
      <link>https://dev.to/saks_007/-my-first-github-project-from-a-local-folder-to-github-using-git-and-ssh-3lna</link>
      <guid>https://dev.to/saks_007/-my-first-github-project-from-a-local-folder-to-github-using-git-and-ssh-3lna</guid>
      <description>&lt;h1&gt;
  
  
  What is git and github
&lt;/h1&gt;

&lt;p&gt;&lt;em&gt;Git is a command line tool used to create project folders and files that can be linked to your github account repositories.&lt;br&gt;
Github is a website where you put all your projects folders and files to enable collaboration with you team or anyone who can contribute to that project.&lt;br&gt;
Repository is a project folder that contains all of your project files.&lt;/em&gt;&lt;/p&gt;
&lt;h2&gt;
  
  
  Creating A Folder And Files
&lt;/h2&gt;

&lt;p&gt;We first create a folder in your desktop using gitbash.&lt;br&gt;
I followed these steps.&lt;/p&gt;

&lt;p&gt;_&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;open gitbash&lt;/li&gt;
&lt;li&gt;First know the current directory, if you in the Root directory tab change directory to Desktop.&lt;/li&gt;
&lt;li&gt;Make directory with the name of the Folder.&lt;/li&gt;
&lt;li&gt;Change the directory to the current Folder created.&lt;/li&gt;
&lt;li&gt;Make a file in the folder you created, like app.py or README.md.&lt;/li&gt;
&lt;li&gt;Write into the README.md and save.&lt;/li&gt;
&lt;li&gt;Display the contents of the file.&lt;/li&gt;
&lt;li&gt;Return to the previuos folder y_ou created.
Use the code below for reference
&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;pwd
cd &lt;/span&gt;Desktop
&lt;span class="nb"&gt;mkdir &lt;/span&gt;Folder name like Kenya-Health-Records
&lt;span class="nb"&gt;cd &lt;/span&gt;Kenya-Health-Records
&lt;span class="nb"&gt;touch &lt;/span&gt;File name with an extension like app.py or README.md
&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"# DATA CLEANING USING EXCEL"&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt;README.md
&lt;span class="nb"&gt;cat &lt;/span&gt;README.md 
&lt;span class="nb"&gt;cd&lt;/span&gt; &lt;span class="nb"&gt;.&lt;/span&gt; &lt;span class="nb"&gt;.&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;h2&gt;
  
  
  Pushing Repo To Github Using Gitbash
&lt;/h2&gt;

&lt;p&gt;While still in gitbash current folder I created.&lt;br&gt;
I did this commands on the CLI&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Run git init to initialize a git repo
Run git status to check I repo is ready 
Run git add . 
Run git commit -m "write your commit message"
Run git log --oneline to check the commit message in a oneline
Run git branch to confirm if you are in the main branch
Run git branch -M main to change master to main branch
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Open github account, login and follow these steps.&lt;/p&gt;

&lt;p&gt;_&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Create a repository and give it a name and description.&lt;/li&gt;
&lt;li&gt;Go to your quick set ip and click SSH.&lt;/li&gt;
&lt;li&gt;Copy the url command&lt;/li&gt;
&lt;li&gt;Open gitbash and make sure you are in the current folder you want to push to github._
Follow this commands below
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Run git remote add origin "paste the url command from github"
Run git remote -v
Run git push - u origin main 
You will be prompted for your paraphrase you created while setting git
You will see a successful message that your folder successful pushed to github
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Now go to your github account and refresh.You will see the files and folder you created in the repository you created on github.&lt;br&gt;
Give yourself a clap&lt;/p&gt;

</description>
      <category>git</category>
      <category>github</category>
      <category>cli</category>
    </item>
  </channel>
</rss>
