2011-09-22 49 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;