CodeGym /課程 /SQL SELF /真實任務中的資料格式化範例

真實任務中的資料格式化範例

SQL SELF
等級 5, 課堂 4
開放

最常見的資料庫應用場景之一,就是為報表準備資料。想像一下:你在大學工作,你老闆(當然完全不懂 SQL 啦)叫你做一份學生清單,要把名字和姓氏合併,還要把生日顯示成 DD-MM-YYYY 格式。任務很明確:資料要排得美美的。這時 SQL 就是我們的好幫手啦!

範例 1:合併名字和姓氏

先來把我們 students 表裡的名字(first_name)和姓氏(last_name)合併起來。

SELECT
    CONCAT(first_name, ' ', last_name) AS full_name
FROM 
    students;

這裡發生了什麼?

  • CONCAT() 是用來合併字串的。我們在名字和姓氏中間加個空格,這樣看起來比較清楚。
  • 結果會存在新的欄位 full_name 裡。

結果可能長這樣:

full_name
Otto Art
Anna Song
Pol Mac

範例 2:日期格式化

現在我們來加上生日的格式化。

SELECT
    CONCAT(first_name, ' ', last_name) AS full_name,
    TO_CHAR(birth_date, 'DD-MM-YYYY') AS formatted_birth_date
FROM 
    students;

這裡有什麼新東西:

  • 我們對 birth_date 欄位用了 TO_CHAR() 函數。
  • 格式 'DD-MM-YYYY' 會把日期變成好讀的樣子(例如:25-12-2001)。

結果:

full_name formatted_birth_date
Otto Art 12-04-1995
Anna Song 03-08-1996
Pol Mac 21-11-1997

搞定!你剛剛做出一份超美的報表。

資料匯出格式化

假設你有個同事想把訂單資料匯出成 CSV 檔,之後要在 Excel 處理。但資料庫裡的格式他看不懂,銷售部的人又很龜毛要特定格式。比如說 total_price 欄位,他們想看到像 $100.00 這種格式。

範例 3:數字轉成貨幣格式

我們來把 orders 表的訂單資料整理好給他們匯出:

SELECT
    order_id,
    TO_CHAR(total_price, 'FM$999,999.00') AS formatted_price
FROM 
    orders;

TO_CHAR() 這裡做了什麼?

  • FM(Fill Mode)會把多餘的空白去掉。
  • $ 會加上貨幣符號。
  • 999,999.00 讓你有千分位和小數點兩位。

結果:

order_id formatted_price
1 $1,000.00
2 $2,500.50
3 $10.00

現在你同事可以輕鬆匯入 Excel,還會在會議上誇你。

最終任務

這裡才是重點。來把你學過的技能都用上吧!

任務

請對 students 表寫一個查詢:

  1. 把名字和姓氏合併成一個 full_name 欄位。
  2. 把生日轉成 DD-MM-YYYY 格式。
  3. 顯示學生到今天的年齡。

查詢大概會長這樣:

SELECT
    CONCAT(first_name, ' ', last_name) AS full_name,
    TO_CHAR(birth_date, 'DD-MM-YYYY') AS formatted_birth_date,
    DATE_PART('year', AGE(birth_date)) AS age
FROM 
    students;

新東西:

  • AGE(birth_date) 會回傳現在和生日之間的間隔(年、月、日)。
  • DATE_PART('year', AGE(birth_date)) 只抓出年數。

結果:

full_name formatted_birth_date age
Otto Art 12-04-1995 28
Anna Song 03-08-1996 27
Pol Mac 21-11-1997 25

這種報表連最挑剔的同事都會滿意。

針對特定條件的格式化

有時候格式化是為了做條件查詢或篩選。比如說,找出這個月生日的學生。

範例 4:依月份篩選

SELECT
    CONCAT(first_name, ' ', last_name) AS full_name,
    TO_CHAR(birth_date, 'DD-MM-YYYY') AS formatted_birth_date
FROM 
    students
WHERE 
    DATE_PART('month', birth_date) = DATE_PART('month', CURRENT_DATE);

這怎麼運作?

  • DATE_PART('month', birth_date) 會抓出生日的月份。
  • CURRENT_DATE 是今天的日期。我們用 DATE_PART() 抓出現在的月份。

格式化加排序一起來

現在把剛剛學的都合起來,再加上排序。比如說,做一份學生依生日排序的清單。

範例 5:依生日排序

SELECT
    CONCAT(first_name, ' ', last_name) AS full_name,
    TO_CHAR(birth_date, 'DD-MM-YYYY') AS formatted_birth_date
FROM 
    students
ORDER BY 
    birth_date ASC;

ASC(升冪)會先顯示年紀最大的學生,用 DESC(降冪)則是最年輕的。

結合唯一值

最後來個進階題。假設我們大學有好幾個分校,你要做一份學生就讀城市的唯一清單,還要按字母排序。

範例 6:唯一值和排序

SELECT DISTINCT
    city 
FROM 
    students
ORDER BY 
    city ASC;

DISTINCT 做什麼?

它會把重複的城市去掉,讓每個城市只出現一次。

這些有什麼用?

方便又好看。 資料排得美美的,工作起來超順,老闆也不會一直問東問西。

準備好面對現實世界。 你可以自動產生報表、處理匯出、還能做出超有質感的簡報。

讓你更有價值。 SQL 不只是資料而已,還是讓資料變得有意義又實用的工具。

把這些技巧用起來,不只是寫查詢,還能做出 SQL 藝術品!下堂課我們會繼續深入 PostgreSQL 的魔法世界。

2
任務
SQL SELF, 等級 5, 課堂 4
上鎖
合併欄位與格式化字串
合併欄位與格式化字串
2
任務
SQL SELF, 等級 5, 課堂 4
上鎖
將數字格式化為貨幣格式
將數字格式化為貨幣格式
1
問卷/小測驗
字串格式化,等級 5,課堂 4
未開放
字串格式化
字串格式化
留言
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION