PostgreSQL - столбец псевдонимов и HAVING - PullRequest
6 голосов
/ 22 сентября 2011
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« не существует.

Как мне сделать что-то подобное?

Ответы [ 2 ]

4 голосов
/ 22 сентября 2011

Оберните это в производную таблицу:

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;

(обратите внимание, что я добавил отсутствующую группу, так как в противном случае запрос был бы недействительным)

4 голосов
/ 22 сентября 2011

Вы не можете использовать псевдонимы в имеющем, и должны дублировать утверждение в имеющем ключеПоскольку вы хотите проверить только на нулевое значение, вы можете сделать это:

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; 
...