parent
1c01546024
commit
064a9422d4
3 changed files with 249 additions and 0 deletions
@ -0,0 +1,99 @@ |
||||
--- |
||||
title: Book Categories |
||||
description: Practice using CASE expressions to categorize books and inventory levels |
||||
order: 220 |
||||
type: challenge |
||||
setup: | |
||||
```sql |
||||
CREATE TABLE book ( |
||||
id INT PRIMARY KEY, |
||||
title VARCHAR(100), |
||||
page_count INT, |
||||
publish_year INT, |
||||
copies_in_stock INT, |
||||
monthly_rentals INT |
||||
); |
||||
|
||||
INSERT INTO book (id, title, page_count, publish_year, copies_in_stock, monthly_rentals) VALUES |
||||
(1, 'SQL Basics', 250, 2020, 5, 12), |
||||
(2, 'Advanced Queries', 450, 2021, 3, 8), |
||||
(3, 'Database Design', 350, 2019, 10, 15), |
||||
(4, 'Query Optimization', 275, 2022, 2, 6), |
||||
(5, 'Data Modeling', 400, 2021, 1, 4), |
||||
(6, 'PostgreSQL Tips', 200, 2023, 8, 20); |
||||
``` |
||||
--- |
||||
|
||||
A library needs to analyze their SQL book collection. They want a report that categorizes books based on various criteria. |
||||
|
||||
Given the following data in table `book`: |
||||
|
||||
| id | title | page_count | publish_year | copies_in_stock | monthly_rentals | |
||||
| --- | ------------------ | ---------- | ------------ | --------------- | --------------- | |
||||
| 1 | SQL Basics | 250 | 2020 | 5 | 12 | |
||||
| 2 | Advanced Queries | 450 | 2021 | 3 | 8 | |
||||
| 3 | Database Design | 350 | 2019 | 10 | 15 | |
||||
| 4 | Query Optimization | 275 | 2022 | 2 | 6 | |
||||
| 5 | Data Modeling | 400 | 2021 | 1 | 4 | |
||||
| 6 | PostgreSQL Tips | 200 | 2023 | 8 | 20 | |
||||
|
||||
Write a query that shows: |
||||
|
||||
- Book title |
||||
- Book length category: |
||||
- `Short` if page_count < 300 |
||||
- `Medium` if page_count between 300 and 400 |
||||
- `Long` if page_count > 400 |
||||
- Publication status: |
||||
- `Recent` if publish_year >= 2022 |
||||
- `Current` if publish_year is 2020 or 2021 |
||||
- `Older` if publish_year < 2020 |
||||
- Stock status: |
||||
- `Low` if copies_in_stock < 3 |
||||
- `Medium` if copies_in_stock between 3 and 7 |
||||
- `High` if copies_in_stock > 7 |
||||
- Popularity: |
||||
- `High Demand` if monthly_rentals > 12 |
||||
- `Medium Demand` if monthly_rentals between 6 and 12 |
||||
- `Low Demand` if monthly_rentals < 6 |
||||
|
||||
## Expected Output |
||||
|
||||
| title | length_category | publication_status | stock_status | popularity | |
||||
| ------------------ | --------------- | ------------------ | ------------ | ------------- | |
||||
| PostgreSQL Tips | Short | Recent | High | High Demand | |
||||
| Database Design | Medium | Older | High | High Demand | |
||||
| SQL Basics | Short | Current | Medium | Medium Demand | |
||||
| Advanced Queries | Long | Current | Medium | Medium Demand | |
||||
| Query Optimization | Short | Recent | Low | Medium Demand | |
||||
|
||||
Data Modeling Medium Current Low Low Demand |
||||
|
||||
## Solution |
||||
|
||||
```sql |
||||
SELECT |
||||
title, |
||||
CASE |
||||
WHEN page_count < 300 THEN 'Short' |
||||
WHEN page_count <= 400 THEN 'Medium' |
||||
ELSE 'Long' |
||||
END as length_category, |
||||
CASE |
||||
WHEN publish_year >= 2022 THEN 'Recent' |
||||
WHEN publish_year >= 2020 THEN 'Current' |
||||
ELSE 'Older' |
||||
END as publication_status, |
||||
CASE |
||||
WHEN copies_in_stock < 3 THEN 'Low' |
||||
WHEN copies_in_stock <= 7 THEN 'Medium' |
||||
ELSE 'High' |
||||
END as stock_status, |
||||
CASE |
||||
WHEN monthly_rentals > 12 THEN 'High Demand' |
||||
WHEN monthly_rentals >= 6 THEN 'Medium Demand' |
||||
ELSE 'Low Demand' |
||||
END as popularity |
||||
FROM books |
||||
ORDER BY monthly_rentals DESC; |
||||
``` |
@ -0,0 +1,78 @@ |
||||
--- |
||||
title: Customer Contact List |
||||
description: Practice using string and conversion functions to standardize customer contact information |
||||
order: 210 |
||||
type: challenge |
||||
setup: | |
||||
```sql |
||||
CREATE TABLE customer ( |
||||
id INT PRIMARY KEY, |
||||
first_name VARCHAR(50), |
||||
last_name VARCHAR(50), |
||||
email VARCHAR(255), |
||||
phone VARCHAR(20) |
||||
); |
||||
|
||||
INSERT INTO customer (id, first_name, last_name, email, phone) VALUES |
||||
(1, 'john', 'DOE', 'JOHN.DOE@email.com', ' 555-123-4567 '), |
||||
(2, 'JANE', 'smith', 'jane.smith@email.com', '555.123.4568'), |
||||
(3, 'Bob', 'WILSON', 'bob.wilson@email.com', '5551234569'), |
||||
(4, 'ALICE', 'brown', 'alice.b@email.com', NULL), |
||||
(5, 'charlie', 'DAVIS', 'charlie.d@email.com', '555-123-4570'); |
||||
``` |
||||
--- |
||||
|
||||
The bookstore is updating their customer contact list and needs to standardize how customer information is displayed. They want all names properly capitalized, emails in lowercase, and phone numbers in a consistent format. |
||||
|
||||
Given the following data in table `customer` |
||||
|
||||
| id | first_name | last_name | email | phone | |
||||
| --- | ---------- | --------- | -------------------- | ------------ | |
||||
| 1 | john | DOE | JOHN.DOE@email.com | 555-123-4567 | |
||||
| 2 | JANE | smith | jane.smith@email.com | 555.123.4568 | |
||||
| 3 | Bob | WILSON | bob.wilson@email.com | 5551234569 | |
||||
| 4 | ALICE | brown | alice.b@email.com | NULL | |
||||
| 5 | charlie | DAVIS | charlie.d@email.com | 555-123-4570 | |
||||
|
||||
Write a query that formats the customer information according to these requirements: |
||||
|
||||
- Full name (first name and last name properly capitalized) |
||||
- Email address (in lowercase) |
||||
- Phone number (Numbers only, or `No phone` if `NULL`) |
||||
|
||||
## Expected Output |
||||
|
||||
You output should look like this: |
||||
|
||||
| full_name | email | phone | |
||||
| ------------- | -------------------- | ---------- | |
||||
| John Doe | john.doe@email.com | 5551234567 | |
||||
| Jane Smith | jane.smith@email.com | 5551234568 | |
||||
| Bob Wilson | bob.wilson@email.com | 5551234569 | |
||||
| Alice Brown | alice.b@email.com | No phone | |
||||
| Charlie Davis | charlie.d@email.com | 5551234570 | |
||||
|
||||
> **Hint:** Use the `REGEXP_REPLACE` function to remove non-numeric characters from the phone number. Use the `g` flag to replace all occurrences of the pattern. |
||||
|
||||
## Solution |
||||
|
||||
```sql |
||||
SELECT |
||||
CONCAT( |
||||
INITCAP(first_name), |
||||
' ', |
||||
INITCAP(last_name) |
||||
) as full_name, |
||||
LOWER(email) as email, |
||||
COALESCE( |
||||
REGEXP_REPLACE( |
||||
TRIM(phone), |
||||
'[^0-9]', |
||||
'', |
||||
'g' |
||||
), |
||||
'No phone' |
||||
) as phone |
||||
FROM customer |
||||
ORDER BY id; |
||||
``` |
@ -0,0 +1,72 @@ |
||||
--- |
||||
title: Membership Duration |
||||
description: Practice using date functions to calculate membership length and categories |
||||
order: 210 |
||||
type: challenge |
||||
setup: | |
||||
```sql |
||||
CREATE TABLE member ( |
||||
id INT PRIMARY KEY, |
||||
name VARCHAR(100), |
||||
join_date DATE |
||||
); |
||||
|
||||
INSERT INTO member (id, name, join_date) VALUES |
||||
(1, 'John Smith', '2022-01-15'), |
||||
(2, 'Mary Johnson', '2023-06-20'), |
||||
(3, 'Bob Wilson', '2024-01-10'), |
||||
(4, 'Alice Brown', '2023-03-01'), |
||||
(5, 'Charlie Davis', '2023-12-25'); |
||||
``` |
||||
--- |
||||
|
||||
The bookstore wants to categorize their members based on how long they've been part of the loyalty program. They need a report showing each member's duration and their corresponding membership tier. |
||||
|
||||
Given the following data in table `member` |
||||
|
||||
| id | name | join_date | |
||||
| --- | ------------- | ---------- | |
||||
| 1 | John Smith | 2022-01-15 | |
||||
| 2 | Mary Johnson | 2023-06-20 | |
||||
| 3 | Bob Wilson | 2024-01-10 | |
||||
| 4 | Alice Brown | 2023-03-01 | |
||||
| 5 | Charlie Davis | 2023-12-25 | |
||||
|
||||
Write a query that shows: |
||||
|
||||
- Member's name |
||||
- Number of months they've been a member |
||||
- Membership tier: |
||||
- `Bronze` if less than 6 months |
||||
- `Silver` if between 6 and 12 months |
||||
- `Gold` if between 12 and 24 months |
||||
- `Platinum` if more than 24 months |
||||
|
||||
## Expected Output |
||||
|
||||
| name | months | tier | |
||||
| ------------- | ------ | -------- | |
||||
| John Smith | 35 | Platinum | |
||||
| Alice Brown | 22 | Gold | |
||||
| Mary Johnson | 18 | Gold | |
||||
| Charlie Davis | 12 | Gold | |
||||
| Bob Wilson | 11 | Silver | |
||||
|
||||
> **Note:** The months will vary based on current date. This example assumes CURRENT_DATE is '2025-01-06'. |
||||
|
||||
## Solution |
||||
|
||||
```sql |
||||
SELECT |
||||
name, |
||||
EXTRACT(YEAR FROM AGE(CURRENT_DATE, join_date)) * 12 + |
||||
EXTRACT(MONTH FROM AGE(CURRENT_DATE, join_date)) AS months, |
||||
CASE |
||||
WHEN AGE(CURRENT_DATE, join_date) < INTERVAL '6 months' THEN 'Bronze' |
||||
WHEN AGE(CURRENT_DATE, join_date) < INTERVAL '12 months' THEN 'Silver' |
||||
WHEN AGE(CURRENT_DATE, join_date) < INTERVAL '24 months' THEN 'Gold' |
||||
ELSE 'Platinum' |
||||
END AS tier |
||||
FROM member |
||||
ORDER BY months DESC; |
||||
``` |
Loading…
Reference in new issue