0% completed
Problem Statement
Table: Checkouts
This table records the checkouts of books in a library. Each record includes a checkout ID, book ID, the year the book was checked out, the number of times it was checked out that year, and the price per checkout.
+----------------+-------+
| Column Name | Type |
+----------------+-------+
| checkout_id | int |
| book_id | int |
| year | int |
| checkouts | int |
| price | int |
+----------------+-------+
(checkout_id, year) is the primary key of this table.
book_id is a foreign key to the Books table.
Each row of this table shows a checkout record of the book book_id in a certain year.
Note that the price is per checkout.
Table: Books
This table lists all the books available in the library.
+------------+-----------+
| Column Name | Type |
+------------+-----------+
| book_id | int |
| book_title | varchar |
+------------+-----------+
book_id is the primary key of this table.
Each row of this table indicates the title of each book.
Develop a solution to select the book id, the first year the book was checked out, the total number of checkouts, and the price for the first year of every book checked out.
Return the resulting table in any order.
Example
Input:
Checkouts table: +-------------+---------+-------+----------+-------+ | checkout_id | book_id | year | checkouts| price | +-------------+---------+-------+----------+-------+ | 1 | 100 | 2008 | 40 | 2 | | 2 | 100 | 2009 | 50 | 2 | | 3 | 200 | 2011 | 60 | 3 | +-------------+---------+-------+----------+-------+
Books table: +---------+-----------------+ | book_id | book_title | +---------+-----------------+ | 100 | War and Peace | | 200 | The Great Gatsby| | 300 | Moby Dick | +---------+-----------------+
Output:
+---------+------------+----------+-------+ | book_id | first_year | checkouts| price | +---------+------------+----------+-------+ | 100 | 2008 | 40 | 2 | | 200 | 2011 | 60 | 3 | +---------+------------+----------+-------+
Try It Yourself
Solution
To identify each book's first year of checkout, along with the total number of checkouts and the price per checkout for that year, we can follow a systematic approach using SQL's aggregation and join capabilities. This ensures accurate retrieval of the desired information by leveraging Common Table Expressions (CTEs) and appropriate filtering.
- Determine the First Year of Checkout for Each Book: Identify the earliest year each book was checked out by finding the minimum year associated with each
book_id
. - Retrieve Checkout Details for the First Year: Obtain the number of checkouts and the price per checkout for each book in its first year of checkout.
- Order the Results: Sort the final output by
book_id
to present the data in an organized manner.
SQL Query
WITH FirstYear AS ( SELECT book_id, MIN(year) AS first_year FROM Checkouts GROUP BY book_id ) SELECT f.book_id, f.first_year, c.checkouts, c.price FROM FirstYear f JOIN Checkouts c ON f.book_id = c.book_id AND f.first_year = c.year ORDER BY book_id;
Step-by-Step Approach
Step 1: Determine the First Year of Checkout for Each Book
Identify the earliest year each book was checked out by finding the minimum year associated with each book_id
.
SQL Query:
WITH FirstYear AS ( SELECT book_id, MIN(year) AS first_year FROM Checkouts GROUP BY book_id )
Explanation:
WITH FirstYear AS (...)
:- Creates a Common Table Expression (CTE) named
FirstYear
that stores the earliest checkout year for each book.
- Creates a Common Table Expression (CTE) named
SELECT book_id, MIN(year) AS first_year
:- Selects each
book_id
and calculates the minimum year it was checked out.
- Selects each
FROM Checkouts
:- Uses the
Checkouts
table as the data source.
- Uses the
GROUP BY book_id
:- Groups the records by
book_id
to perform the aggregation, ensuring that the minimum year is calculated for each individual book.
- Groups the records by
Output After Step 1:
+---------+------------+ | book_id | first_year | +---------+------------+ | 100 | 2008 | | 200 | 2011 | +---------+------------+
Step 2: Retrieve Checkout Details for the First Year
For each book, obtain the number of checkouts and the price per checkout corresponding to its first year of checkout.
SQL Query:
SELECT f.book_id, f.first_year, c.checkouts, c.price FROM FirstYear f JOIN Checkouts c ON f.book_id = c.book_id AND f.first_year = c.year
Explanation:
SELECT f.book_id, f.first_year, c.checkouts, c.price
:- Selects the
book_id
, the determinedfirst_year
, the number ofcheckouts
, and theprice
per checkout.
- Selects the
FROM FirstYear f
:- Uses the
FirstYear
CTE as the primary table to access each book's first checkout year.
- Uses the
JOIN Checkouts c ON f.book_id = c.book_id AND f.first_year = c.year
:-
Joins the
Checkouts
table to fetch the corresponding checkout details for the first year of each book. -
f.book_id = c.book_id AND f.first_year = c.year
:- Ensures that only the records matching the first year are retrieved, effectively linking each book to its first checkout record.
-
Output After Step 2:
+---------+------------+----------+-------+ | book_id | first_year | checkouts| price | +---------+------------+----------+-------+ | 100 | 2008 | 40 | 2 | | 200 | 2011 | 60 | 3 | +---------+------------+----------+-------+
Step 3: Order the Results by Book ID
Sort the final output in ascending order based on book_id
to ensure organized presentation.
SQL Query:
ORDER BY book_id;
Explanation:
ORDER BY book_id
:- Sorts the results by
book_id
in ascending order, making the output orderly and easy to interpret.
- Sorts the results by
Final Output:
+---------+------------+----------+-------+ | book_id | first_year | checkouts| price | +---------+------------+----------+-------+ | 100 | 2008 | 40 | 2 | | 200 | 2011 | 60 | 3 | +---------+------------+----------+-------+
.....
.....
.....
Table of Contents
Contents are not accessible
Contents are not accessible
Contents are not accessible
Contents are not accessible
Contents are not accessible