SQL Exercise:
Write a query to find the top 3 cities by total sales revenue, including:
- The total revenue for each city.
- The number of unique customers who placed orders in that city.
- Exclude cities with total sales revenue below $1,000.
Table Creation Scripts:
1. Create Products Table
Create Customers Table
CREATE TABLE Customers ( CustomerID INT PRIMARY KEY, Name VARCHAR(50), City VARCHAR(50) );
3. Create Orders Table
CREATE TABLE Orders ( OrderID INT PRIMARY KEY, CustomerID INT, ProductID INT, Quantity INT, OrderDate DATE );
Data Insertion Scripts:
INSERT INTO Products (ProductID, ProductName, Category, Price) VALUES (101, 'Laptop', 'Electronics', 1000), (102, 'Smartphone', 'Electronics', 800), (103, 'Headphones', 'Accessories', 150), (104, 'Desk Chair', 'Furniture', 200), (105, 'Monitor', 'Electronics', 300); INSERT INTO Customers (CustomerID, Name, City) VALUES (1, 'Alice', 'New York'), (2, 'Bob', 'San Francisco'), (3, 'Charlie', 'Chicago'), (4, 'David', 'New York'), (5, 'Eve', 'Chicago'); INSERT INTO Orders (OrderID, CustomerID, ProductID, Quantity, OrderDate) VALUES (1001, 1, 101, 1, '2024-01-10'), (1002, 2, 102, 2, '2024-01-15'), (1003, 3, 104, 1, '2024-01-20'), (1004, 4, 103, 4, '2024-01-25'), (1005, 5, 105, 1, '2024-01-30'), (1006, 2, 101, 1, '2024-02-05');
Solution:
WITH CitySalesRevenue AS (SELECT CUST.city, Count(DISTINCT CUST.customerid) AS UniqueCustomers, Sum(P.price) AS TotalRevenue FROM orders AS O INNER JOIN customers AS CUST ON CUST.customerid = O.customerid INNER JOIN products P ON O.productid = P.productid GROUP BY CUST.city HAVING Sum(P.price) > 1000) SELECT TOP 3 * FROM CitySalesRevenue ORDER BY TotalRevenue DESC
Output:

Explanation:
- CitySalesRevenue CTE:
- The CTE calculates the total revenue and the number of unique customers for each city.
- This is equivalent to the main part of the original query but is encapsulated for reusability and clarity.
- Main Query:
- The main query selects results from the CityRevenue CTE.
- It applies a filter (WHERE TotalRevenue >= 1000), sorts the cities by TotalRevenue in descending order, and apply TOP to get the top 3 cities.
![]()
