PostgreSQL-别名列和HAVING

6EQ*_*58b 8 postgresql alias having

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;
Run Code Online (Sandbox Code Playgroud)

正在获取:错误:»pjz«列不存在。

我该怎么做?

Mac*_*iej 9

其他选项是通过WITH语句包围查询 - 例如:

WITH x as (
  SELECT coalesce(SUM(X.Count)*3600, 0) AS PJZ, X.Mass
  FROM X
  WHERE X.Mass > 2000
)
SELECT * from X WHERE PJZ >=10
Run Code Online (Sandbox Code Playgroud)

在我看来,这比代码重复要好得多


a_h*_*ame 6

将其包装到派生表中:

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;
Run Code Online (Sandbox Code Playgroud)

(请注意,我添加了缺少的组,否则查询将无效)


jis*_*shi 5

您不能在hading中使用别名,而必须在hading cluause中重复该语句。由于您只想检查null,因此可以这样做:

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; 
Run Code Online (Sandbox Code Playgroud)