|
| 1 | + |
| 2 | + |
| 3 | +# **1068. Product Sales Analysis I** |
| 4 | + |
| 5 | +## **Problem Statement** |
| 6 | +You are given two tables: |
| 7 | + |
| 8 | +- `Sales` (contains sales data including `product_id`, `year`, `quantity`, and `price`). |
| 9 | +- `Product` (contains `product_id` and `product_name`). |
| 10 | + |
| 11 | +Each `product_id` in `Sales` is a **foreign key** referring to the `Product` table. |
| 12 | + |
| 13 | +### **Sales Table** |
| 14 | +``` |
| 15 | ++---------+------------+------+----------+-------+ |
| 16 | +| sale_id | product_id | year | quantity | price | |
| 17 | ++---------+------------+------+----------+-------+ |
| 18 | +| int | int | int | int | int | |
| 19 | ++---------+------------+------+----------+-------+ |
| 20 | +``` |
| 21 | +- `(sale_id, year)` is the **primary key** (unique values). |
| 22 | +- `product_id` refers to the `Product` table. |
| 23 | +- `price` represents the **per unit price** of the product in that year. |
| 24 | + |
| 25 | +### **Product Table** |
| 26 | +``` |
| 27 | ++------------+--------------+ |
| 28 | +| product_id | product_name | |
| 29 | ++------------+--------------+ |
| 30 | +| int | varchar | |
| 31 | ++------------+--------------+ |
| 32 | +``` |
| 33 | +- `product_id` is the **primary key** of this table. |
| 34 | + |
| 35 | +### **Task:** |
| 36 | +Find the `product_name`, `year`, and `price` for each sale in the `Sales` table. |
| 37 | + |
| 38 | +--- |
| 39 | + |
| 40 | +## **Example 1:** |
| 41 | + |
| 42 | +### **Input:** |
| 43 | +**Sales Table** |
| 44 | +``` |
| 45 | ++---------+------------+------+----------+-------+ |
| 46 | +| sale_id | product_id | year | quantity | price | |
| 47 | ++---------+------------+------+----------+-------+ |
| 48 | +| 1 | 100 | 2008 | 10 | 5000 | |
| 49 | +| 2 | 100 | 2009 | 12 | 5000 | |
| 50 | +| 7 | 200 | 2011 | 15 | 9000 | |
| 51 | ++---------+------------+------+----------+-------+ |
| 52 | +``` |
| 53 | + |
| 54 | +**Product Table** |
| 55 | +``` |
| 56 | ++------------+--------------+ |
| 57 | +| product_id | product_name | |
| 58 | ++------------+--------------+ |
| 59 | +| 100 | Nokia | |
| 60 | +| 200 | Apple | |
| 61 | +| 300 | Samsung | |
| 62 | ++------------+--------------+ |
| 63 | +``` |
| 64 | + |
| 65 | +### **Output:** |
| 66 | +``` |
| 67 | ++--------------+-------+-------+ |
| 68 | +| product_name | year | price | |
| 69 | ++--------------+-------+-------+ |
| 70 | +| Nokia | 2008 | 5000 | |
| 71 | +| Nokia | 2009 | 5000 | |
| 72 | +| Apple | 2011 | 9000 | |
| 73 | ++--------------+-------+-------+ |
| 74 | +``` |
| 75 | + |
| 76 | +### **Explanation:** |
| 77 | +- **Sale ID 1:** `Nokia` was sold in **2008** for **5000**. |
| 78 | +- **Sale ID 2:** `Nokia` was sold in **2009** for **5000**. |
| 79 | +- **Sale ID 7:** `Apple` was sold in **2011** for **9000**. |
| 80 | + |
| 81 | +--- |
| 82 | + |
| 83 | +## **SQL Solutions** |
| 84 | + |
| 85 | +### **1️⃣ Standard MySQL Solution** |
| 86 | +```sql |
| 87 | +SELECT p.product_name, s.year, s.price |
| 88 | +FROM Sales s |
| 89 | +JOIN Product p ON s.product_id = p.product_id; |
| 90 | +``` |
| 91 | +#### **Explanation:** |
| 92 | +1. **JOIN** the `Sales` table with the `Product` table using `product_id`. |
| 93 | +2. **Select `product_name`, `year`, and `price`** from the joined result. |
| 94 | + |
| 95 | +--- |
| 96 | + |
| 97 | +### **2️⃣ Window Function (SQL) Solution** |
| 98 | +```sql |
| 99 | +WITH SalesData AS ( |
| 100 | + SELECT s.product_id, s.year, s.price, p.product_name |
| 101 | + FROM Sales s |
| 102 | + JOIN Product p ON s.product_id = p.product_id |
| 103 | +) |
| 104 | +SELECT product_name, year, price |
| 105 | +FROM SalesData; |
| 106 | +``` |
| 107 | +#### **Explanation:** |
| 108 | +1. **CTE `SalesData`** → Stores the joined data from `Sales` and `Product`. |
| 109 | +2. **Final SELECT** → Retrieves `product_name`, `year`, and `price`. |
| 110 | + |
| 111 | +--- |
| 112 | + |
| 113 | +## **Pandas Solution (Python)** |
| 114 | +```python |
| 115 | +import pandas as pd |
| 116 | + |
| 117 | +# Sample Data |
| 118 | +sales_data = {'sale_id': [1, 2, 7], |
| 119 | + 'product_id': [100, 100, 200], |
| 120 | + 'year': [2008, 2009, 2011], |
| 121 | + 'quantity': [10, 12, 15], |
| 122 | + 'price': [5000, 5000, 9000]} |
| 123 | + |
| 124 | +product_data = {'product_id': [100, 200, 300], |
| 125 | + 'product_name': ['Nokia', 'Apple', 'Samsung']} |
| 126 | + |
| 127 | +# Create DataFrames |
| 128 | +sales_df = pd.DataFrame(sales_data) |
| 129 | +product_df = pd.DataFrame(product_data) |
| 130 | + |
| 131 | +# Perform Join |
| 132 | +result = sales_df.merge(product_df, on='product_id')[['product_name', 'year', 'price']] |
| 133 | + |
| 134 | +print(result) |
| 135 | +``` |
| 136 | + |
| 137 | +### **Explanation:** |
| 138 | +1. **Create DataFrames** → Convert `Sales` and `Product` tables into Pandas DataFrames. |
| 139 | +2. **Perform `merge()` on `product_id`** → Equivalent to SQL `JOIN`. |
| 140 | +3. **Select required columns (`product_name`, `year`, `price`)**. |
| 141 | + |
| 142 | +--- |
| 143 | + |
| 144 | +## **File Structure** |
| 145 | +``` |
| 146 | +LeetCode1068/ |
| 147 | +├── problem_statement.md # Contains the problem description and constraints. |
| 148 | +├── sql_solution.sql # Contains the SQL solutions (Standard + Window Functions). |
| 149 | +├── pandas_solution.py # Contains the Pandas solution. |
| 150 | +├── README.md # Overview of the problem and available solutions. |
| 151 | +``` |
| 152 | + |
| 153 | +--- |
| 154 | + |
| 155 | +## **Useful Links** |
| 156 | +- [LeetCode Problem 1068](https://leetcode.com/problems/product-sales-analysis-i/) |
| 157 | +- [SQL JOIN Documentation](https://www.w3schools.com/sql/sql_join.asp) |
| 158 | +- [Pandas Merge Documentation](https://pandas.pydata.org/docs/reference/api/pandas.DataFrame.merge.html) |
| 159 | + |
| 160 | +--- |
| 161 | + |
| 162 | +This README now includes: |
| 163 | +✅ **MySQL Query** |
| 164 | +✅ **Window SQL Query** |
| 165 | +✅ **Pandas Python Solution** |
| 166 | +✅ **File Structure & Useful Links** |
| 167 | + |
| 168 | +🚀 **Now it's a complete guide!** 🚀 |
0 commit comments