高考申論題
114年
[資訊處理] 資料庫應用
第 二 題
📖 題組:
三、根據下列客戶訂單資料回答相關查詢SQL敘述,資料表格為:Customer(CID, Name), Orders(OID, CID, TotalAmount, OrderDate), Payment(PID, OID, AmountPaid)。(每小題 10 分,共 30 分) (一)在 OrderDate 為“2025.01.01”當天,所有客戶訂單總量排行,依總量由高到低列出客戶姓名與總量。 (二)找出截至 2025.01.01,曾有付款行為且總付款金額超過 10,000 的客戶姓名與其總付款金額。 (三)所有訂單但付款金額(AmountPaid)總和不足訂單金額(TotalAmount)的客戶名稱與欠款金額,並以欠款金額由高至低排序。
三、根據下列客戶訂單資料回答相關查詢SQL敘述,資料表格為:Customer(CID, Name), Orders(OID, CID, TotalAmount, OrderDate), Payment(PID, OID, AmountPaid)。(每小題 10 分,共 30 分) (一)在 OrderDate 為“2025.01.01”當天,所有客戶訂單總量排行,依總量由高到低列出客戶姓名與總量。 (二)找出截至 2025.01.01,曾有付款行為且總付款金額超過 10,000 的客戶姓名與其總付款金額。 (三)所有訂單但付款金額(AmountPaid)總和不足訂單金額(TotalAmount)的客戶名稱與欠款金額,並以欠款金額由高至低排序。
📝 此題為申論題,共 3 小題
小題 (二)
找出截至 2025.01.01,曾有付款行為且總付款金額超過 10,000 的客戶姓名與其總付款金額。
思路引導 VIP
本題重點在於多表 JOIN 操作與分組聚合函數(SUM)的搭配。需先將 Customer、Orders、Payment 三表串接,使用 WHERE 篩選日期條件,再利用 GROUP BY 依客戶分組,最後透過 HAVING 子句過濾出付款總和超過 10,000 的結果。
小題 (一)
在 OrderDate 為“2025.01.01”當天,所有客戶訂單總量排行,依總量由高到低列出客戶姓名與總量。
思路引導 VIP
首先確認需要的資料表為 Customer 與 Orders,透過 CID 進行內部連接(JOIN)。接著使用 WHERE 篩選特定日期,並利用 GROUP BY 對客戶進行分組,搭配聚合函數(COUNT 或 SUM)計算總量,最後以 ORDER BY 加上 DESC 進行降冪排序。
小題 (三)
所有訂單但付款金額(AmountPaid)總和不足訂單金額(TotalAmount)的客戶名稱與欠款金額,並以欠款金額由高至低排序。
思路引導 VIP
本題重點在於避免「一對多」關聯造成的重複加總(Fan-out問題),必須先將 Payment 表以訂單(OID)分組加總付款金額。接著使用 LEFT JOIN 關聯 Orders 表,並利用 COALESCE 處理尚未付款的 NULL 值,計算欠款後依客戶分組並篩選出欠款大於 0 的紀錄,最後排序。