2011-09-22 57 views
3
SELECT 
CASE WHEN SUM(X.Count)*3600 is null THEN '0' 
      ELSE 
      SUM(X.Count)*3600 
     END AS PJZ, 
     X.Mass 
FROM X 
WHERE X.Mass > 2000 
HAVING ((X.Mass/PJZ * 100) - 100) >= 10; 

獲取:錯誤:列»pjz«不存在。PostgreSQL - 別名列和HAVING

我該怎麼做這樣的事情?

+0

[爲什麼我不能在計數(*)中使用別名](http://stackoverflow.com/questions/2068682/why-cant-i-use-alias-in-a-count-列和參考它在一個條款) –

回答

2

裹成一個派生表:

SELECT CASE 
      WHEN PJZ = 0 THEN 100 
      ELSE PJZ 
     END as PJZ, 
     mass 
FROM (
    SELECT CASE 
      WHEN SUM(X.Count)*3600 is null THEN '0' 
      ELSE SUM(X.Count)*3600 
      END AS PJZ, 
      X.Mass 
    FROM X 
    WHERE X.Mass > 2000 
    GROUP BY X.mass 
) t 
WHERE PJZ = 0 
    OR ((X.Mass/PJZ * 100) - 100) >= 10; 

(請注意,我用的,否則查詢添加缺少的集團將不有效)

+0

但現在我已經得到零除的問題。 PJZ可能爲零。 – 6EQUJ5HD209458b

+0

然後排除WHERE PJZ爲零的行。或者根據您的要求返回CASE語句中的1(或任何其他非零值) –

+0

我無法排除行,因爲我也想看到它們。如果PJZ爲0,則:((X.Mass/PJZ * 100) - 100)應該顯示100。所以我需要另一個IF ELSE ... – 6EQUJ5HD209458b

1

你不能在擁有別名的情況下使用別名,並且必須在具有可疑的情況下複製該語句。既然你只是想檢查空,你可以這樣做:

SELECT coalesce(SUM(X.Count)*3600, 0) AS PJZ, X.Mass 
FROM X 
WHERE X.Mass > 2000 
HAVING ((X.Mass/coalesce(SUM(X.Count)*3600, 0) * 100) - 100) >= 10;