【问题标题】:PostgreSQL - Aliases column and HAVINGPostgreSQL - 别名列和 HAVING
【发布时间】:2011-11-22 14:07:14
【问题描述】:
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 column-alias


【解决方案1】:

你不能在有中使用别名,并且必须在有子句中重复该语句。由于您只想检查 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; 

【讨论】:

    【解决方案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;
    

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

    【讨论】:

    • 但是现在我遇到了除以零的问题。 PJZ 可能为零。
    • 然后排除 PJZ 为零的行。或者根据您的要求在 CASE 语句中返回 1(或任何其他非零值)
    • 我无法排除这些行,因为我也想查看它们。如果 PJZ 为 0,则: ((X.Mass / PJZ * 100) - 100) 应该为我显示 100。所以我需要另一个 IF ELSE...
    【解决方案3】:

    其他选项是用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
    

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-08-10
      • 2013-10-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-04-29
      • 2013-01-07
      • 2017-10-07
      相关资源
      最近更新 更多