File size: 11,609 Bytes
e7cf806
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
[
  {
    "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);"
  }
]