您可以添加標記爲每個用戶,然後通過列數除以:
SELECT
user,
(test1 + test2 + test3)/3 AS average_mark
FROM users
,或者忽略NULL值:
SELECT
user,
(ISNULL(test1, 0) + ISNULL(test2, 0) + ISNULL(test3, 0))/(
CASE WHEN test1 IS NULL THEN 0 ELSE 1 END +
CASE WHEN test2 IS NULL THEN 0 ELSE 1 END +
CASE WHEN test3 IS NULL THEN 0 ELSE 1 END
) AS average_mark
FROM users
你的表結構有兩個缺點:
- 因爲您的表結構是動態創建的,您還必須動態構造此查詢。
- 因爲有些學生不會接受所有的測試,你可能會有一些NULL值。
您可能想要考慮更改您的表結構來解決這兩個問題。我會建議你使用以下結構的表:
user test mark
-------------------
A1 1 10
A2 1 90
A3 1 78
A1 2 20
A2 2 87
A3 2 12
A1 3 30
A2 3 75
A3 3 34
然後你就可以做到這一點,讓每用戶平均標記:
SELECT user, AVG(mark) AS average_mark
FROM users
GROUP BY user
這讓每個測試的平均成績:
SELECT test, AVG(mark) AS average_mark
FROM users
GROUP BY test
感謝您的回覆。我的數據也包含NULL值,所以按列數取平均值可能會給出錯誤的結果。 – Mahesh 2010-09-09 16:44:02