15
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«が存在しません。

どうすればこのようなことができますか?

4

3 に答える 3

10

持っていることでエイリアスを使用することはできず、持っていることでステートメントを複製する必要があります。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; 
于 2011-09-22T07:34:53.163 に答える
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;

(不足しているグループを追加したことに注意してください。そうしないと、クエリが無効になります)

于 2011-09-22T07:41:55.893 に答える
0

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

私の意見では、コードの重複よりもはるかに優れています

于 2021-05-14T15:34:40.593 に答える