資料排序和格式化是很重要的技能,可以幫你準備易讀的報表、優化資料分析流程,還能讓用戶體驗更好。這些技巧在你做分析報表、準備資料匯出,或日常跟資料庫打交道時都超有用。實際上你常常會遇到要把資料排得美美的、去掉重複紀錄,還有把資訊排序好讓大家一看就懂。今天我們就來搞定這些事!
範例 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合併成一個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 |
我們的目標:
- 建立
formatted_order_date欄位,把訂單日期變成 DD-MM-YYYY 格式。 - 刪掉重複的客戶和日期紀錄(只留唯一的
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 |
我們的目標:
- 把名字和姓氏合併成一個
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" 學生資料被合併成一行,排序則是先依姓氏、再依生日。
實作練習
用今天學到的東西來解這個題目:
題目:你有一個 products 資料表,內容如下:
| product_id | category | product_name | price |
|---|---|---|---|
| 1 | 電子產品 | 手機 | 50000 |
| 2 | 服裝 | 外套 | 8000 |
| 3 | 電子產品 | 筆電 | 70000 |
| 4 | 服裝 | 外套 | 8000 |
- 建立
formatted_product欄位,把product_name跟類別用減號連起來,例如:手機 - 電子產品。 - 刪掉重複的
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