題組內容
三、根據下列客戶訂單資料回答相關查詢SQL敘述,資料表格為:Customer(CID, Name), Orders(OID, CID, TotalAmount, OrderDate), Payment(PID, OID, AmountPaid)。(每小題 10 分,共 30 分)
(三)所有訂單但付款金額(AmountPaid)總和不足訂單金額(TotalAmount) 的客戶名稱與欠款金額,並以欠款金額由高至低排序。
申論題作答 (共 1 筆)
依時間顯示最近 1 筆。
詳解 (共 1 筆)
Yuchang Wu
詳解 #6560179
SELECT
c.Name,
SUM(o.TotalAmount) - IFNULL(SUM(p.AmountPaid), 0) AS OutstandingAmount
FROM
Customer c
JOIN
Orders o ON c.CID = o.CID
LEFT JOIN
Payment p ON o.OID = p.OID
GROUP BY
o.OID, c.Name
HAVING
OutstandingAmount > 0
ORDER BY
OutstandingAmount DESC;
說明:
• 使用左外連接 (LEFT JOIN) 將訂單與付款資料連結,確保即使沒有付款也會列出。
• 計算每筆訂單的欠款:訂單金額總和減去付款金額總和。
• 欠款金額大於零即表示尚未付清。
• 按欠款金額從高到低排序。
如果要以客戶整體欠款(所有訂單加總後)來排序,可以改成下面的版本:
• 使用左外連接 (LEFT JOIN) 將訂單與付款資料連結,確保即使沒有付款也會列出。
• 計算每筆訂單的欠款:訂單金額總和減去付款金額總和。
• 欠款金額大於零即表示尚未付清。
• 按欠款金額從高到低排序。
如果要以客戶整體欠款(所有訂單加總後)來排序,可以改成下面的版本:
SELECT
c.Name,
SUM(o.TotalAmount) - IFNULL(SUM(p.AmountPaid), 0) AS OutstandingAmount
FROM
Customer c
JOIN
Orders o ON c.CID = o.CID
LEFT JOIN
Payment p ON o.OID = p.OID
GROUP BY
c.CID, c.Name
HAVING
OutstandingAmount > 0
ORDER BY
OutstandingAmount DESC;
c.Name,
SUM(o.TotalAmount) - IFNULL(SUM(p.AmountPaid), 0) AS OutstandingAmount
FROM
Customer c
JOIN
Orders o ON c.CID = o.CID
LEFT JOIN
Payment p ON o.OID = p.OID
GROUP BY
c.CID, c.Name
HAVING
OutstandingAmount > 0
ORDER BY
OutstandingAmount DESC;