2014-04-18 51 views
0

請參考選擇之前選擇的列給出錯誤1054

select sum(orders) as total, count(*) as c, c/total as average 

它給出了一個「錯誤代碼:1054未知列......」

有沒有辦法實現這個逆向引用不非常煩人的工作包裝選擇在另一個選擇?

我想這是一個重複,但我一直沒能找到它,所以,這是我會問這個問題。

+0

您需要重複表達式'count(*)/ sum(orders)' –

+0

'AVG = SUM/COUNT' –

+0

@MhalidJunaid,所以你必須計算所有的東西兩次,打破DRYness? – djechlin

回答

0

別名列在查詢完成之前不存在,因此您不能在同一個查詢中使用它們。

只是重複表達式計算:

select 
    sum(orders) as total, 
    count(*) as c, 
    count(*)/sum(orders) as average 
from 
    yourtable 

還是做選擇,然後計算:

select 
    s.total, s.c, s.c/s.total as average 
from 
    (select 
    sum(orders) as total, 
    count(*) as c 
    from <yourtable>) s 
+0

這兩種選擇都不可怕嗎?第一個是非DRY,需要重複計算工作量很大的工作(除非MySQL是魔術和緩存它),第二個難以維護,很難修改和使用(例如,我經常需要有時看到原始數據和有時包裝的數據,所以不得不來回或複製它,這又不是DRY) – djechlin

+0

是的,它們都很臭,但這是它與大多數DBMSs一起工作的方式。 –

0

使用avg功能:

select sum(orders) as total, count(*) as c, avg(orders) as average 

基礎上列名,我假設你真的想要平均值而不是「1/average」作爲expr隱藏在你的問題中。

+0

這是一個玩具的例子,在現實生活中我正在做'sum(if(folders_scanned> 0,1,0))'。 – djechlin

+1

@djechlin。 。 。如果你使用的是愚蠢的MySQL。 'sum(folders_scanned> 0)'更容易。你也可以用這種方式做平均。 –

+0

你是對的,「如果」是無關緊要的。我不知道你的意思是「以同樣的方式做平均」,看起來我仍然必須做兩次'sum(folders_scanned> 0)'。 – djechlin