2010-01-20 67 views
13

比方說,我有這樣的事情:引用postgres查詢中的動態列?

select sum(points) as total_points 
from sometable 
where total_points > 25 
group by username 

我不能指total_points在where子句中,因爲我得到以下錯誤:ERROR: column "total_points" does not exist。在這種情況下,我可以在where子句中重寫sum(points),但是我想用某種方式來完成上面的操作。

  • 有什麼辦法將結果存儲在變量使用存儲過程?
  • 如果我在where子句中重寫sum(points),是postgres足夠聰明而不重新計算它嗎?

回答

7

我相信,PostgreSQL是像其他品牌的SQL,你需要做的:

SELECT t.* 
FROM (
    SELECT SUM(points) AS total_points 
    FROM sometable 
    GROUP BY username 
) t 
WHERE total_points > 25 

編輯:忘了別名的子查詢。

+0

不,Postgres確實支持HAVING子句 - 請參閱Quassnoi的答案。 – 2010-01-20 15:30:32

+3

雖然'PostgreSQL'不支持'HAVING'子句,這也是一個有效的答案(除了子查詢應該是別名)。看不出有什麼理由降低它。 – Quassnoi 2010-01-20 15:32:57

+0

@Quassnoi - 同意。如果我爲我的別名做了一些冗長的數學函數,我寧願將它設置在一個子查詢中所以我的查詢看起來更清潔/更好。 – 2010-01-20 15:39:41

17
SELECT SUM(points) AS total_points 
FROM sometable 
GROUP BY 
     username 
HAVING SUM(points) > 25 

PostgreSQL將不計算總和的兩倍。

+0

我沒那麼熟悉PostgreSQL的,但我認爲它會抱怨,因爲GROUP BY列不在SELECT列表。這是PostgreSQL的不同之處嗎? – 2010-01-22 12:26:51

+0

'@Bob Jarvis':沒有數據庫我知道會抱怨'GROUP BY'列不在'SELECT'列表中。 – Quassnoi 2010-01-22 12:49:31

+3

這應該是被接受的答案。 – 2012-01-26 09:52:07

6

你有語句錯誤:

select sum(points) as total_points 
from sometable 
where total_points > 25 -- <- error here 
group by username 

您不能total_points限行,因爲sometable沒有該列。你想要的是限制由total_points gouped結果行,計算每個組,所以:

select sum(points) as total_points 
from sometable 
group by username 
having sum(points) > 25 

如果你在你的例子取代total_point,那麼你只需再檢查一下,如果總和從所有行計算的是大於25,然後返回所有行,按用戶名分組。

編輯:
永遠記住順序:

  1. FROMJOIN的得到表
  2. WHERE從表
  3. 限行是SELECT爲限列
  4. GROUP BY,用於將相關組排入相關組
  5. HAVING的限制導致羣體
  6. ORDER BY訂單導致
+0

'PostgreSQL'不允許'HAVING'子句中的別名。 – Quassnoi 2010-01-20 15:30:27

+0

@quassnoi我不知道。我強硬的說,大多數RDBMS-es接受別名 – MBO 2010-01-20 15:37:40

+0

'@ MBO':主要的四個'MySQL'允許這個。 'Oracle','SQL Server'和'PostgreSQL'不需要 – Quassnoi 2010-01-20 16:57:43