2014-01-26 100 views
3

首先,如果「別名」是錯誤的單詞,請糾正我。我正在討論有關使用AS運算符重命名該列的問題。如何在SQL中的數學運算符中使用別名?

所以我想計算平均是這樣的:

SELECT 
users.username AS player_name, 
COUNT(*) AS total_games, 
SUM(games.points) AS total_points, 
(total_points/total_games) AS average_points 

FROM games, 
INNER JOIN users 
ON games.player_id = users.id 
GROUP BY games.player_id 

(查詢可能是錯誤的,它只是一個簡單的例子)

在此查詢

,行

(total_points/total_games) AS average_points 

給出錯誤:unknown column total_points

所以我怎麼能解決這個問題,以保持,而不是寫這個使用別名:

(SUM(games.points)/COUNT(*)) AS average_points 

感謝您的幫助!

+0

列別名僅在處理了'SELECT'後纔可用。所以只有'ORDER BY'才能訪問。在你的情況下,你可能需要用別名子查詢你的COUNT()值,然後在外部引用。 –

回答

4

我相當確定這是不可能使用別名。你將不得不這樣做「長」的方式......

(SUM(games.points)/COUNT(*)) AS average_points 

編輯:我想編輯這個答案,第二@jbeldock的答案作爲一個解決方案,因爲多次使用我自己。我發現自己寫出公式,並在查詢的其他部分重新使用它們,導致帶有複製/粘貼部分的大量亂七八糟的查詢。將你的論壇放在子查詢中可以讓你在外部查詢中使用他們的結果,並使事情更加優雅。

4

不幸的是,你不能以這種方式使用列別名。它們僅在SELECT語句被處理後可用。但是,您可以在子查詢或公用表表達式(CTE)中執行此操作。下面是簡單的子查詢:

SELECT player_name, 
     total_games, 
     total_points, 
     (total_points/total_games) AS average_points 
FROM 
(SELECT 
users.username AS player_name, 
COUNT(*) AS total_games, 
SUM(games.points) AS total_points, 

FROM games, 
INNER JOIN users 
ON games.player_id = users.id 
GROUP BY games.player_id) as InnerQuery 
0

你不能在他們的定義同級別使用別名 - 你需要把別名定義中的子查詢。但是,您不需要別名,因爲SQL具有AVG()函數:

SELECT users.username AS player_name, 
     COUNT(*) AS total_games, 
     SUM(games.points) AS total_points, 
     AVG(games.points) AS average_points 
FROM games INNER JOIN 
    users 
    ON games.player_id = users.id 
GROUP BY games.player_id;