Grokking SQL for Tech Interviews
Ask Author
Back to course home

0% completed

Vote For New Content
26. Unused Accounts
Table of Contents

Contents are not accessible

Contents are not accessible

Contents are not accessible

Contents are not accessible

Contents are not accessible

Problem

Table: Accounts

+---------------+---------+
| Column Name   | Type    |
+---------------+---------+
| account_id    | int     |
| account_name  | varchar |
+---------------+---------+
account_id is the primary key (column with unique values) for this table.
Each row of this table contains the ID and the name of an account in the bank.

Table: Transactions

+---------------+---------+
| Column Name   | Type    |
+---------------+---------+
| transaction_id| int     |
| account_id    | int     |
| transaction_date | date |
+---------------+---------+
transaction_id is the primary key (column with unique values) for this table.
Each row of this table contains the ID of a transaction, the ID of the account that initiated the transaction, and the date when the transaction was made.

Problem Definition

Write a solution to find all accounts that did not make any transactions in 2020.

Return the result table ordered by account_name in ascending order.

Example

Input: 
Accounts table:
+------------+--------------+
| account_id | account_name |
+------------+--------------+
| 1          | Alice        |
| 2          | Bob          |
| 3          | Charlie      |
+------------+--------------+
Transactions table:
+----------------+------------+-----------------+
| transaction_id | account_id | transaction_date|
+----------------+------------+-----------------+
| 1              | 1          | 2020-09-01      |
| 2              | 2          | 2020-09-02      |
| 3              | 1          | 2020-09-03      |
| 4              | 3          | 2019-08-21      |
| 5              | 2          | 2021-07-03      |
+----------------+------------+-----------------+
Output: 
+--------------+
| account_name |
+--------------+
| Charlie      |
+--------------+

Try It Yourself

MYSQL
MYSQL

. . . .

Solution

To identify all accounts that did not make any transactions in the year 2020, we can leverage SQL's LEFT JOIN along with conditional filtering. This approach allows us to include all accounts and exclude those that have associated transactions in the specified year.

  • Perform a Left Join Between Accounts and Transactions: Join the Accounts table with the Transactions table on account_id, focusing only on transactions that occurred in 2020.
  • Filter Accounts Without Transactions in 2020: Identify accounts that have no matching transactions in the year 2020 by checking for NULL values in the joined Transactions data.
  • Order the Results by Account Name: Sort the final list of accounts alphabetically by account_name for organized presentation.

SQL Query

SELECT A.account_name FROM Accounts AS A LEFT JOIN Transactions AS T ON A.account_id = T.account_id AND YEAR(transaction_date) = '2020' WHERE T.account_id IS NULL ORDER BY account_name ASC;

Step-by-Step Approach

Step 1: Perform a Left Join Between Accounts and Transactions for the Year 2020

Combine the Accounts and Transactions tables to associate each account with its transactions in the year 2020. The LEFT JOIN ensures that all accounts are included, even if they have no transactions in 2020.

SQL Query:

SELECT A.account_name, T.account_id FROM Accounts AS A LEFT JOIN Transactions AS T ON A.account_id = T.account_id AND YEAR(transaction_date) = '2020';

Explanation:

  • SELECT A.account_name, T.account_id:
    • Retrieves the account_name from the Accounts table and the corresponding account_id from the Transactions table.

  • LEFT JOIN Transactions AS T:
    • Performs a LEFT JOIN with the Transactions table, aliased as T, ensuring all accounts are included regardless of transaction activity.
  • ON A.account_id = T.account_id AND YEAR(transaction_date) = '2020':
    • Defines the join condition to match accounts with their transactions in the year 2020.

Output After Step 1:

Assuming the example input provided, the intermediate result after the LEFT JOIN would be:

+--------------+------------+ | account_name | account_id | +--------------+------------+ | Alice | 1 | | Bob | 2 | | Charlie | NULL | +--------------+------------+

Step 2: Filter Accounts Without Transactions in 2020

Identify accounts that did not make any transactions in 2020 by selecting records where the joined Transactions data is NULL.

SQL Query:

SELECT A.account_name FROM Accounts AS A LEFT JOIN Transactions AS T ON A.account_id = T.account_id AND YEAR(transaction_date) = '2020' WHERE T.account_id IS NULL;

Explanation:

  • WHERE T.account_id IS NULL:
    • Filters the results to include only those accounts that have no corresponding transactions in 2020. If T.account_id is NULL, it indicates no transaction record exists for that account in the specified year.

Output After Step 2:

Based on the intermediate result, the filtered output would be:

+--------------+ | account_name | +--------------+ | Charlie | +--------------+

Step 3: Order the Results by Account Name in Ascending Order

Sort the final list of accounts alphabetically by account_name to present the data in an organized and readable manner.

SQL Query:

ORDER BY account_name ASC;

Explanation:

  • ORDER BY account_name ASC:
    • Sorts the resulting list of account names in ascending (alphabetical) order.

Final Output:

+--------------+ | account_name | +--------------+ | Charlie | +--------------+

.....

.....

.....

Like the course? Get enrolled and start learning!

Table of Contents

Contents are not accessible

Contents are not accessible

Contents are not accessible

Contents are not accessible

Contents are not accessible