|
[ |
|
{ |
|
"id": "q1", |
|
"title": "List all customers", |
|
"difficulty": "Beginner", |
|
"description": "Retrieve the names and emails of all customers.", |
|
"hint": "Use SELECT on the customers table.", |
|
"expected_sql": "SELECT name, email FROM customers;" |
|
}, |
|
{ |
|
"id": "q2", |
|
"title": "Show savings accounts", |
|
"difficulty": "Beginner", |
|
"description": "List all accounts of type 'Savings' with their balances.", |
|
"hint": "Use WHERE clause to filter by account_type.", |
|
"expected_sql": "SELECT account_id, balance FROM accounts WHERE account_type = 'Savings';" |
|
}, |
|
{ |
|
"id": "q3", |
|
"title": "Find customers in New York", |
|
"difficulty": "Beginner", |
|
"description": "Show the names and ages of customers living in New York.", |
|
"hint": "Use WHERE clause to filter by city.", |
|
"expected_sql": "SELECT name, age FROM customers WHERE city = 'New York';" |
|
}, |
|
{ |
|
"id": "q4", |
|
"title": "Count total accounts", |
|
"difficulty": "Beginner", |
|
"description": "Count the total number of accounts in the system.", |
|
"hint": "Use COUNT() function on the accounts table.", |
|
"expected_sql": "SELECT COUNT(*) AS total_accounts FROM accounts;" |
|
}, |
|
{ |
|
"id": "q5", |
|
"title": "List accounts opened in 2023", |
|
"difficulty": "Beginner", |
|
"description": "Retrieve all accounts opened in 2023.", |
|
"hint": "Use WHERE clause with LIKE on opened_on.", |
|
"expected_sql": "SELECT account_id, account_type, opened_on FROM accounts WHERE opened_on LIKE '2023%';" |
|
}, |
|
{ |
|
"id": "q6", |
|
"title": "List distinct account types", |
|
"difficulty": "Beginner", |
|
"description": "Get all unique account types from the accounts table.", |
|
"hint": "Use DISTINCT to avoid duplicate account types.", |
|
"expected_sql": "SELECT DISTINCT account_type FROM accounts;" |
|
}, |
|
{ |
|
"id": "q7", |
|
"title": "Find accounts for John Doe", |
|
"difficulty": "Beginner", |
|
"description": "List all accounts owned by John Doe.", |
|
"hint": "Join accounts with customers and filter by name.", |
|
"expected_sql": "SELECT a.account_id, a.account_type, a.balance FROM accounts a JOIN customers c ON a.customer_id = c.customer_id WHERE c.name = 'John Doe';" |
|
}, |
|
{ |
|
"id": "q8", |
|
"title": "Show customers under 30", |
|
"difficulty": "Beginner", |
|
"description": "Retrieve the names and cities of customers younger than 30 years old.", |
|
"hint": "Use WHERE clause to filter by age.", |
|
"expected_sql": "SELECT name, city FROM customers WHERE age < 30;" |
|
}, |
|
{ |
|
"id": "q9", |
|
"title": "List loan accounts", |
|
"difficulty": "Beginner", |
|
"description": "Show all accounts of type 'Loan' with their balances.", |
|
"hint": "Use WHERE clause to filter by account_type.", |
|
"expected_sql": "SELECT account_id, balance FROM accounts WHERE account_type = 'Loan';" |
|
}, |
|
{ |
|
"id": "q10", |
|
"title": "Find customer emails", |
|
"difficulty": "Beginner", |
|
"description": "Retrieve the names and email addresses of all customers.", |
|
"hint": "Select name and email from customers table.", |
|
"expected_sql": "SELECT name, email FROM customers;" |
|
}, |
|
{ |
|
"id": "q11", |
|
"title": "Count accounts per customer", |
|
"difficulty": "Intermediate", |
|
"description": "Show the number of accounts each customer owns.", |
|
"hint": "Join customers and accounts, then GROUP BY customer name.", |
|
"expected_sql": "SELECT c.name, COUNT(a.account_id) AS account_count FROM customers c LEFT JOIN accounts a ON c.customer_id = a.customer_id GROUP BY c.name;" |
|
}, |
|
{ |
|
"id": "q12", |
|
"title": "Total balance per customer", |
|
"difficulty": "Intermediate", |
|
"description": "Calculate the total balance across all accounts for each customer.", |
|
"hint": "Join customers and accounts, then GROUP BY customer name and SUM balance.", |
|
"expected_sql": "SELECT c.name, SUM(a.balance) AS total_balance FROM customers c JOIN accounts a ON c.customer_id = a.customer_id GROUP BY c.name;" |
|
}, |
|
{ |
|
"id": "q13", |
|
"title": "Average balance by account type", |
|
"difficulty": "Intermediate", |
|
"description": "Find the average balance for each account type.", |
|
"hint": "GROUP BY account_type and use AVG on balance.", |
|
"expected_sql": "SELECT account_type, AVG(balance) AS avg_balance FROM accounts GROUP BY account_type;" |
|
}, |
|
{ |
|
"id": "q14", |
|
"title": "Customers with multiple accounts", |
|
"difficulty": "Intermediate", |
|
"description": "List customers who have more than one account.", |
|
"hint": "Join customers and accounts, GROUP BY customer, and use HAVING clause.", |
|
"expected_sql": "SELECT c.name, COUNT(a.account_id) AS account_count FROM customers c JOIN accounts a ON c.customer_id = a.customer_id GROUP BY c.name HAVING COUNT(a.account_id) > 1;" |
|
}, |
|
{ |
|
"id": "q15", |
|
"title": "Accounts with negative balance", |
|
"difficulty": "Intermediate", |
|
"description": "Show all accounts with a negative balance, including customer names.", |
|
"hint": "Join accounts with customers and filter by balance < 0.", |
|
"expected_sql": "SELECT a.account_id, c.name, a.account_type, a.balance FROM accounts a JOIN customers c ON a.customer_id = c.customer_id WHERE a.balance < 0;" |
|
}, |
|
{ |
|
"id": "q16", |
|
"title": "Customers with no accounts", |
|
"difficulty": "Intermediate", |
|
"description": "List customers who do not have any accounts.", |
|
"hint": "Use LEFT JOIN and check for NULL in accounts table.", |
|
"expected_sql": "SELECT c.name FROM customers c LEFT JOIN accounts a ON c.customer_id = a.customer_id WHERE a.account_id IS NULL;" |
|
}, |
|
{ |
|
"id": "q17", |
|
"title": "Account details with customer info", |
|
"difficulty": "Intermediate", |
|
"description": "Show account details including customer name and city.", |
|
"hint": "Join accounts and customers tables.", |
|
"expected_sql": "SELECT a.account_id, a.account_type, a.balance, c.name, c.city FROM accounts a JOIN customers c ON a.customer_id = c.customer_id;" |
|
}, |
|
{ |
|
"id": "q18", |
|
"title": "Count accounts by city", |
|
"difficulty": "Intermediate", |
|
"description": "Count the number of accounts for customers in each city.", |
|
"hint": "Join customers and accounts, GROUP BY city.", |
|
"expected_sql": "SELECT c.city, COUNT(a.account_id) AS account_count FROM customers c JOIN accounts a ON c.customer_id = a.customer_id GROUP BY c.city;" |
|
}, |
|
{ |
|
"id": "q19", |
|
"title": "Accounts opened before 2023", |
|
"difficulty": "Intermediate", |
|
"description": "List all accounts opened before 2023, including customer names.", |
|
"hint": "Join accounts with customers and filter by opened_on.", |
|
"expected_sql": "SELECT a.account_id, a.account_type, c.name FROM accounts a JOIN customers c ON a.customer_id = c.customer_id WHERE a.opened_on < '2023-01-01';" |
|
}, |
|
{ |
|
"id": "q20", |
|
"title": "Total balance by account type", |
|
"difficulty": "Intermediate", |
|
"description": "Calculate the total balance for each account type.", |
|
"hint": "GROUP BY account_type and SUM balance.", |
|
"expected_sql": "SELECT account_type, SUM(balance) AS total_balance FROM accounts GROUP BY account_type;" |
|
}, |
|
{ |
|
"id": "q21", |
|
"title": "Customers with highest total balance", |
|
"difficulty": "Advanced", |
|
"description": "Find the customer with the highest total balance across all their accounts.", |
|
"hint": "Join tables, SUM balance, GROUP BY customer, and use LIMIT.", |
|
"expected_sql": "SELECT c.name, SUM(a.balance) AS total_balance FROM customers c JOIN accounts a ON c.customer_id = a.customer_id GROUP BY c.name ORDER BY total_balance DESC LIMIT 1;" |
|
}, |
|
{ |
|
"id": "q22", |
|
"title": "Youngest customer with loan account", |
|
"difficulty": "Advanced", |
|
"description": "Identify the youngest customer who has a Loan account.", |
|
"hint": "Join tables, filter by account_type, and use MIN on age.", |
|
"expected_sql": "SELECT c.name, c.age FROM customers c JOIN accounts a ON c.customer_id = a.customer_id WHERE a.account_type = 'Loan' ORDER BY c.age ASC LIMIT 1;" |
|
}, |
|
{ |
|
"id": "q23", |
|
"title": "Account age in years", |
|
"difficulty": "Advanced", |
|
"description": "Calculate the age of each account in years as of '2025-07-11'.", |
|
"hint": "Use JULIANDAY to calculate date difference and divide by 365.25.", |
|
"expected_sql": "SELECT account_id, account_type, ROUND((JULIANDAY('2025-07-11') - JULIANDAY(opened_on)) / 365.25, 1) AS account_age FROM accounts;" |
|
}, |
|
{ |
|
"id": "q24", |
|
"title": "Customers with diverse account types", |
|
"difficulty": "Advanced", |
|
"description": "List customers who have more than one type of account.", |
|
"hint": "Join tables, count distinct account types, and use HAVING.", |
|
"expected_sql": "SELECT c.name, COUNT(DISTINCT a.account_type) AS type_count FROM customers c JOIN accounts a ON c.customer_id = a.customer_id GROUP BY c.name HAVING type_count > 1;" |
|
}, |
|
{ |
|
"id": "q25", |
|
"title": "Account openings by year", |
|
"difficulty": "Advanced", |
|
"description": "Show the number of accounts opened each year.", |
|
"hint": "Use STRFTIME to extract year and GROUP BY.", |
|
"expected_sql": "SELECT STRFTIME('%Y', opened_on) AS year, COUNT(account_id) AS account_count FROM accounts GROUP BY year;" |
|
}, |
|
{ |
|
"id": "q26", |
|
"title": "Customers with high negative balance", |
|
"difficulty": "Advanced", |
|
"description": "Find customers with a total balance less than -5000 across all accounts.", |
|
"hint": "Join tables, SUM balance, and use HAVING clause.", |
|
"expected_sql": "SELECT c.name, SUM(a.balance) AS total_balance FROM customers c JOIN accounts a ON c.customer_id = a.customer_id GROUP BY c.name HAVING total_balance < -5000;" |
|
}, |
|
{ |
|
"id": "q27", |
|
"title": "Oldest account per customer", |
|
"difficulty": "Advanced", |
|
"description": "Show the earliest opened account for each customer.", |
|
"hint": "Join tables, use MIN on opened_on, and GROUP BY customer.", |
|
"expected_sql": "SELECT c.name, MIN(a.opened_on) AS earliest_opened FROM customers c JOIN accounts a ON c.customer_id = a.customer_id GROUP BY c.name;" |
|
}, |
|
{ |
|
"id": "q28", |
|
"title": "Cities with high average balance", |
|
"difficulty": "Advanced", |
|
"description": "List cities where the average account balance is greater than 1000.", |
|
"hint": "Join tables, GROUP BY city, and use HAVING clause.", |
|
"expected_sql": "SELECT c.city, AVG(a.balance) AS avg_balance FROM customers c JOIN accounts a ON c.customer_id = a.customer_id GROUP BY c.city HAVING avg_balance > 1000;" |
|
}, |
|
{ |
|
"id": "q29", |
|
"title": "Customers with no savings accounts", |
|
"difficulty": "Advanced", |
|
"description": "List customers who do not have a Savings account.", |
|
"hint": "Use NOT IN or LEFT JOIN to exclude customers with Savings accounts.", |
|
"expected_sql": "SELECT c.name FROM customers c WHERE c.customer_id NOT IN (SELECT a.customer_id FROM accounts a WHERE a.account_type = 'Savings');" |
|
}, |
|
{ |
|
"id": "q30", |
|
"title": "Most common account type per city", |
|
"difficulty": "Advanced", |
|
"description": "Find the most common account type in each city.", |
|
"hint": "Join tables, group by city and account_type, use subquery or LIMIT.", |
|
"expected_sql": "SELECT c.city, a.account_type, COUNT(a.account_id) AS account_count FROM customers c JOIN accounts a ON c.customer_id = a.customer_id GROUP BY c.city, a.account_type HAVING COUNT(a.account_id) = (SELECT MAX(account_count) FROM (SELECT COUNT(account_id) AS account_count FROM accounts a2 JOIN customers c2 ON a2.customer_id = c2.customer_id WHERE c2.city = c.city GROUP BY a2.account_type) AS counts);" |
|
} |
|
] |
|
|