各位大大好,
我有兩個資料表
客戶資料(客戶編號,客戶名稱,信用額度)
訂單系統(訂單編號,客戶名稱,交易日期,數量,單價)
希望顯示客戶名稱,交易金額,信用度比率
1.交易金額=數量X單價
2.信用度比率=每位客戶的交易金額除以「客戶資料」資料檔的「信用額度」
我執行以下SQL
SELECT 客戶名稱,
SUM(數量單價) AS 交易金額,
信用度比率=SUM(數量單價)/(SELECT 信用額度 FROM 客戶資料)
FROM 訂單系統
GROUP BY 客戶名稱
出現:
子查詢傳回不只 1 個值。這種狀況在子查詢之後有 =、!=、<、<=、>、>= 或是子查詢做為運算式使用時是不允許的。
請問該如何修正?謝謝。
恩...
SELECT 客戶名稱,
SUM(數量單價) AS 交易金額,
信用度比率 = SUM(數量單價) / (SELECT top 1 信用額度 FROM 客戶資料)
FROM 訂單系統
GROUP BY 客戶名稱
或者...
SELECT 客戶名稱,
SUM(數量單價) AS 交易金額,
信用度比率 = SUM(數量單價) / (SELECT top 1 信用額度 FROM 客戶資料 WHERE 客戶資料.客戶名稱 = 訂單系統.客戶名稱)
FROM 訂單系統
GROUP BY 客戶名稱
SELECT A.客戶名稱 客戶名稱,
A.交易金額 交易金額,(A.交易金額 / B.信用額度)*100 信用度比率
FROM
(SELECT 客戶名稱,
SUM(數量單價) AS 交易金額,
FROM 訂單系統
GROUP BY 客戶名稱) A , 客戶資料 B
WHERE A.客戶名稱=B.客戶名稱
SELECT
A.客戶名稱,
A.交易金額,
A.交易金額/B.信用額度 AS 信用度比率
FROM
(SELECT 客戶名稱, SUM(數量*單價) AS 交易金額
FROM 訂單系統 GROUP BY 客戶名稱
) A
LEFT JOIN 客戶資料 B ON A.客戶名稱 = B.客戶名稱
SELECT 客戶名稱,
SUM(數量單價) AS 交易金額,
信用度比率=SUM(數量單價)/(SELECT 信用額度 FROM 客戶資料)
FROM 訂單系統
GROUP BY 客戶名稱
錯誤提示:子查詢傳回不只 1 個值。這種狀況在子查詢之後有 =、!=、<、<=、>、>= 或是子查詢做為運算式使用時是不允許的。
在這段SQL中,子查詢是指你放在 SELECT 中的
SELECT 信用額度 FROM 客戶資料
出錯的原因在於這個子查詢回傳了超過1筆的資料,導致無法計算下列式子。
(因為分母有多個值,無法讓SQL知道要怎麼除)
SUM(數量單價)/(SELECT 信用額度 FROM 客戶資料)
關於這段 SQL,你應該是思考成:自[訂單系統]中計算每個客戶的[總交易金額],並同時列出[信用度比率]。
因此在計算信用度比率時,從[客戶資料]中抓取的信用額度應該要是與訂單系統中該筆資料的客戶相同對吧?
例如訂單系統中會計算出 3 筆客戶(A, B, C)的總交易金額,在計算信用度比率時就會是
而你的寫法則是
所以你的子查詢就是缺少 WHERE 條件
為了讓子查詢能對應該筆訂單系統的客戶,我加了一點小修改。
SELECT
so.客戶名稱,
SUM(so.數量單價) AS '交易金額',
SUM(so.數量單價)/(SELECT cu.信用額度 FROM 客戶資料 cu WHERE cu.客戶名稱 = so.客戶名稱) AS '信用度比率'
FROM
訂單系統 so
GROUP BY
so.客戶名稱
最後就如上面各位大大們提醒的,子查詢盡量不要放在 SELECT 或 WHERE 中。
我認為如果習慣了會讓思考變的不彈性,無法容易切換成多表格join的思維,未來在遇到效能問題或大量表格join情況時不容易做事。