データのソートやフォーマットは、読みやすいレポートを作ったり、データ分析を最適化したり、ユーザーとのやりとりを良くするために超大事なスキルだよ。こういう知識は、分析レポートを作るときや、エクスポート用にデータを準備するとき、あと普段のDB作業でもめっちゃ役立つ。実際には、データをキレイにフォーマットしたり、重複レコードを消したり、見やすいようにソートしたりする課題にしょっちゅう出くわすんだ。今日はまさにそれをやってみよう!
例1: 苗字でソートされた、名前と苗字を結合したユニークな顧客リストの作成
customersテーブルには顧客データが入ってるよ:
| id | first_name | last_name | city |
|---|---|---|---|
| 1 | Alex | Lin | New York |
| 2 | Maria | Chi | Los Angeles |
| 3 | Alex | Lin | New York |
| 4 | Anna | Song | Chicago |
今回のゴール:
first_nameとlast_nameを1つのカラムfull_nameに結合する。- ユニークな顧客だけを抽出する。
- リストを苗字(
last_name)でソートする。
SQLクエリ
SELECT DISTINCT
CONCAT(first_name, ' ', last_name) AS full_name,
city
FROM customers
ORDER BY last_name;
| full_name | city |
|---|---|
| Maria Chi | Los Angeles |
| Alex Lin | New York |
| Anna Song | Chicago |
Alex Linみたいな重複レコードはDISTINCTで消えて、リスト全体は苗字順でアルファベット順にソートされてるのに注目してね。
例2: 注文データのフォーマットとソート
ordersテーブルには注文データが入ってる:
| order_id | customer_name | order_date | total_amount |
|---|---|---|---|
| 1 | Alex Lin | 2023-10-01 | 1500 |
| 2 | Maria Chi | 2023-10-02 | 2000 |
| 3 | Alex Lin | 2023-10-03 | 1500 |
| 4 | Anna Song | 2023-10-04 | 3000 |
今回のゴール:
- 注文日を
DD-MM-YYYY形式で表示するformatted_order_dateカラムを作る。 - 顧客名と注文日の重複レコードを消す(
customer_nameとorder_dateのユニークな組み合わせだけ残す)。 - 注文を日付の降順でソートする。
- SQLクエリ
SELECT DISTINCT
customer_name,
TO_CHAR(order_date, 'DD-MM-YYYY') AS formatted_order_date,
total_amount
FROM orders
ORDER BY order_date DESC;
結果:
| customer_name | formatted_order_date | total_amount |
|---|---|---|
| Anna Song | 04-10-2023 | 3000 |
| Alex Lin | 03-10-2023 | 1500 |
| Maria Chi | 02-10-2023 | 2000 |
TO_CHAR()関数で日付をDD-MM-YYYY形式に変換して、DISTINCTで重複レコードを除外してるのが分かるよね。
例3: 学生の「名前+苗字」のユニークな組み合わせを抽出し、苗字と誕生日でソート
studentsテーブルには学生データが入ってる:
| student_id | first_name | last_name | birth_date |
|---|---|---|---|
| 1 | Alex | Lin | 2001-03-15 |
| 2 | Maria | Chi | 2000-06-20 |
| 3 | Alex | Lin | 2001-03-15 |
| 4 | Anna | Song | 1999-10-10 |
今回のゴール:
- 名前と苗字を1つのカラム
full_nameに結合する。 - 「名前+苗字」のユニークな組み合わせを抽出する。
- 学生を苗字、次に誕生日でソートする。
SELECT DISTINCT
CONCAT(first_name, ' ', last_name) AS full_name,
birth_date
FROM students
ORDER BY last_name, birth_date;
結果:
| full_name | birth_date |
|---|---|
| Maria Chi | 2000-06-20 |
| Alex Lin | 2001-03-15 |
| Anna Song | 1999-10-10 |
特に注目:「Alex Lin」の同じレコード2つは1行にまとめられて、ソートはまず苗字、次に誕生日でされてるよ。
実践課題
今日学んだことを使って、次の課題をやってみて!
課題: productsテーブルがあって、こんなデータが入ってる:
| product_id | category | product_name | price |
|---|---|---|---|
| 1 | Denki | Terefon | 50000 |
| 2 | Odezhda | Kurtka | 8000 |
| 3 | Denki | Noutobuku | 70000 |
| 4 | Odezhda | Kurtka | 8000 |
formatted_productカラムを作って、product_nameとカテゴリをハイフンで結合する(例:Terefon - Denki)。product_nameとcategoryの重複組み合わせを消す。- 商品をカテゴリで、次に価格(安い順)でソートする。
この課題をやるためのクエリの構造はこんな感じだよ:
SELECT DISTINCT
CONCAT(product_name, ' - ', category) AS formatted_product,
price
FROM products
ORDER BY category, price ASC;
このクエリの結果を自分でイメージしてみて!
CONCAT()、DISTINCT、ORDER BYみたいな関数を使うと、データがめっちゃ読みやすくて整理されるんだ。これは実際のプロジェクトや課題で超重要だから、どうやって組み合わせるかしっかり理解して、例題で練習してみてね!
GO TO FULL VERSION