<?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: Sourav Sarkar</title>
    <description>The latest articles on DEV Community by Sourav Sarkar (@sourav_sarkar_78787d235fa).</description>
    <link>https://dev.to/sourav_sarkar_78787d235fa</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3630403%2Fa99795b1-d6e9-4ff1-8752-b651ca419fbd.png</url>
      <title>DEV Community: Sourav Sarkar</title>
      <link>https://dev.to/sourav_sarkar_78787d235fa</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/sourav_sarkar_78787d235fa"/>
    <language>en</language>
    <item>
      <title>Building Two SQL Dashboards: E-commerce Analytics + Student Performance Reporting</title>
      <dc:creator>Sourav Sarkar</dc:creator>
      <pubDate>Wed, 26 Nov 2025 10:57:49 +0000</pubDate>
      <link>https://dev.to/sourav_sarkar_78787d235fa/building-two-sql-dashboards-e-commerce-analytics-student-performance-reporting-5fh7</link>
      <guid>https://dev.to/sourav_sarkar_78787d235fa/building-two-sql-dashboards-e-commerce-analytics-student-performance-reporting-5fh7</guid>
      <description>&lt;p&gt;Over the past week, I worked on two hands-on SQL projects as part of my learning journey. Both projects strengthened my analytical skills and helped me understand how SQL powers real-world decision-making.&lt;/p&gt;

&lt;p&gt;This blog covers:&lt;/p&gt;

&lt;p&gt;E-commerce Analytics Dashboard (revenue, top products, customer behavior)&lt;/p&gt;

&lt;p&gt;Student Management Dashboard (averages, top scorers, subject difficulty)&lt;/p&gt;

&lt;p&gt;I’m sharing my queries, approach, and key findings so others learning SQL can see how business insights come together using joins, aggregations, window functions, and time-series logic.&lt;/p&gt;

&lt;p&gt;🛒 Project 1: E-commerce Analytics Dashboard (SQL)&lt;/p&gt;

&lt;p&gt;The goal was to understand customer behavior, product performance, and revenue trends using an e-commerce dataset consisting of:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;customers&lt;/li&gt;
&lt;li&gt;products&lt;/li&gt;
&lt;li&gt;orders&lt;/li&gt;
&lt;li&gt;order_items&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Below are the insights I generated.&lt;/p&gt;

&lt;p&gt;📈 1. Monthly Revenue Trend (Last 24 Months)&lt;/p&gt;

&lt;p&gt;I used DATE_TRUNC() to group sales by month and track revenue over the last two years.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;SELECT
    TO_CHAR(DATE_TRUNC('month', o.order_date), 'Month YYYY') AS month_label,
    DATE_TRUNC('month', o.order_date) AS month_start,
    SUM(oi.quantity * oi.unit_price) AS total_revenue,
    COUNT(*) AS total_orders
FROM orders o
JOIN order_items oi ON oi.order_id = o.order_id
WHERE o.order_date &amp;gt;= NOW() - INTERVAL '24 months'
GROUP BY month_start
ORDER BY month_start;

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

&lt;/div&gt;



&lt;p&gt;🔍 What it tells us&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Month-over-month revenue changes&lt;/li&gt;
&lt;li&gt;Growth direction for the business&lt;/li&gt;
&lt;/ol&gt;

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

&lt;p&gt;🔄 2. Customers Whose Orders Increased from 2024 → 2025&lt;/p&gt;

&lt;p&gt;This query compares order counts across years to identify fast-growing customers.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;select 
c.name,c.customer_id,
sum(case when extract(year from o.order_date) = 2025 then 1 else 0 end) as year_date_2025,
sum(case when extract(year from o.order_date) = 2024 then 1 else 0 end) as year_date_2024
from customers as c
join orders as o on o.customer_id  = c.customer_id
group by c.name,c.customer_id
having 
      sum(case when extract(year from o.order_date) = 2025 then 1 end)
    &amp;gt; sum(case when extract(year from o.order_date) = 2024 then 1 end)
   AND 
      sum(case when extract(year from o.order_date) = 2025 then 1 end) &amp;gt; 0
   AND
      sum(case when extract(year from o.order_date) = 2024 then 1 end) &amp;gt; 0;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;🔍 What it tells us&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Which customers have become more active&lt;/li&gt;
&lt;li&gt;A simple year-over-year loyalty signal&lt;/li&gt;
&lt;li&gt;Helps identify customers worth targeting for retention campaigns&lt;/li&gt;
&lt;/ul&gt;

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

&lt;p&gt;🏆 3. Top 3 Products in Each Category (Window Function)&lt;/p&gt;

&lt;p&gt;Using ROW_NUMBER() to rank items within each category:&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 (
    select 
        p.name as product_name, 
        p.category,
        p.product_id,
        sum(ot.quantity * ot.unit_price) as total_sales,
        row_number() over(
            partition by p.category
            order by sum(ot.quantity * ot.unit_price) desc
        ) as rn
    from products as p
    join order_items as ot on ot.product_id = p.product_id
    group by p.category,p.name,p.product_id
) x 
where rn &amp;lt;= 3
order by category, total_sales desc;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;🔍 What it tells us&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The top performers inside each category&lt;/li&gt;
&lt;li&gt;Helps identify products to promote or bundle&lt;/li&gt;
&lt;/ul&gt;

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

&lt;p&gt;🛍️ 4. Top 10 Best-Selling Products (By Quantity)&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;select 
products.product_id,
products.name as product_name,
sum(order_items.unit_price * order_items.quantity) as total_sale,
sum(order_items.quantity) as quantity
from products
join order_items on order_items.product_id = products.product_id
group by products.product_id
order by total_sale desc
limit 10;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;🔍 Key insight&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;1. These are your highest-demand products&lt;/li&gt;
&lt;li&gt;2. Useful for stock planning and reorder frequency&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;💰 5. Top 15 Revenue Generating Products&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;select 
products.product_id as product_id,
products.name as product_name,
sum(order_items.quantity) as total_units_sold,
round(avg(order_items.unit_price),2) as avg_unit_price,
sum(order_items.quantity * order_items.unit_price) as total_revenue
from products
join order_items on order_items.product_id = products.product_id
group by products.product_id
order by total_revenue desc
limit 15;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;🔍 Key insight&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;These products make the biggest contribution to revenue&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;📸 Screenshot :&lt;/p&gt;

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

&lt;p&gt;🧩 Other Insights (from my additional queries)&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Average Order Value per month → financial health indicator&lt;/li&gt;
&lt;li&gt;Category performance → which category earns the most&lt;/li&gt;
&lt;li&gt;One-time vs repeat customers → customer segmentation&lt;/li&gt;
&lt;li&gt;Top spenders → lifetime value leaderboard&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Together, these form a complete e-commerce analytics dashboard using SQL.&lt;/p&gt;

&lt;p&gt;🎓 Project 2: Student Management Dashboard (SQL)&lt;/p&gt;

&lt;p&gt;This project focused on analyzing academic performance using tables:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;students&lt;/li&gt;
&lt;li&gt;subjects&lt;/li&gt;
&lt;li&gt;scores&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The goal was to create insights similar to what a school dashboard would show.&lt;/p&gt;

&lt;p&gt;📊 1. Student Performance Summary&lt;/p&gt;

&lt;p&gt;Using AVG, MIN, MAX, and a CASE statement to create a “performance review”.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;select 
s.name ,
round(avg(sc.score),2) as avg_score,
min(sc.score) as min_score,
max(sc.score) as max_score,
case 
   when round(avg(sc.score),2) &amp;gt; 95 then 'Academically Blessed'
   when round(avg(sc.score),2) &amp;gt; 90 then 'Top Performer'
   when round(avg(sc.score),2) &amp;gt; 80 then 'Above Average'
   when round(avg(sc.score),2) &amp;gt; 70 then 'Average'
   when round(avg(sc.score),2) &amp;gt; 55 then 'Needs Improvement'
   else 'Failing'
end as performance_review
from scores as sc
join students as s on s.student_id = sc.student_id
group by s.name;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;🔍 What it tells us&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Each student's average&lt;/li&gt;
&lt;li&gt;Performance category&lt;/li&gt;
&lt;li&gt;Range of scores&lt;/li&gt;
&lt;/ul&gt;

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

&lt;p&gt;🏅 2. Top Performers per Subject&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;SELECT 
    sub.subject_name,
    s.name AS top_student,
    sc.score AS top_score
FROM scores sc
JOIN subjects sub ON sub.subject_id = sc.subject_id
JOIN students s ON s.student_id = sc.student_id
WHERE sc.score = (
    SELECT MAX(score)
    FROM scores sc2
    WHERE sc2.subject_id = sc.subject_id
)
ORDER BY sub.subject_name;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;🔍 Key insight&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Highlights subject toppers&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;🎯 3. Subject Difficulty Overview&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;select sub.subject_name,
       round(avg(sc.score),2) as avg_mark,
       max(sc.score) as max_marks,
       min(sc.score) as min_marks,
       (sum(case when sc.score &amp;gt; 50 then 1 end) * 100 / count(*)) as passing_rate
from subjects as sub
join scores sc on sc.subject_id = sub.subject_id
group by sub.subject_name
order by passing_rate;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;🔍 What it tells us&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Which subjects are easiest/hardest&lt;/li&gt;
&lt;li&gt;Passing rate trend&lt;/li&gt;
&lt;li&gt;Score distribution visibility&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;📸 Screenshot placeholder:&lt;/p&gt;

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

&lt;p&gt;&lt;em&gt;&lt;strong&gt;What I Learned from These Two Projects&lt;/strong&gt;&lt;/em&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt; Window functions (ROW_NUMBER)&lt;/li&gt;
&lt;li&gt; Time-series analysis (DATE_TRUNC, TO_CHAR)&lt;/li&gt;
&lt;li&gt; Business metrics like AOV, revenue, LTV&lt;/li&gt;
&lt;li&gt; CASE expressions for segmentation&lt;/li&gt;
&lt;li&gt; Joining multiple tables to build dashboards&lt;/li&gt;
&lt;li&gt; Thinking like an analyst, not just writing queries&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Both projects gave me real-world experience in building analytics dashboards purely using SQL.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Final Thoughts&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;These two projects helped me understand how SQL is used in:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;E-commerce analytics&lt;/li&gt;
&lt;li&gt;Education dashboards&lt;/li&gt;
&lt;li&gt;KPI tracking&lt;/li&gt;
&lt;li&gt;Ranking and segmentation&lt;/li&gt;
&lt;li&gt;Time-based reporting&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;If you're also learning SQL, try replicating these dashboards on any dataset you can find — it’s a great way to level up your analytical thinking. Feedbacks are appreciated&lt;/p&gt;

&lt;p&gt;Data sets used  &lt;/p&gt;

&lt;p&gt;&lt;a href="https://drive.google.com/file/d/1sUgoepDGw4ykCtFyy5H0GbSJ1Alk5XKi/view?usp=sharing" rel="noopener noreferrer"&gt;ecommerce&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://drive.google.com/file/d/1t287B57qMCEIy0MJyUvaQlehlnNijlni/view?usp=sharing" rel="noopener noreferrer"&gt;students&lt;/a&gt;&lt;/p&gt;

</description>
      <category>postgressql</category>
      <category>sideprojects</category>
      <category>database</category>
    </item>
  </channel>
</rss>
