4

SELECT私は一般化するかなり複雑な計算をしようとしています:

  1. メインクエリは、テーブルのワイルドカード選択です
  2. 1 つのサブクエリはCOUNT()、条件に基づいてすべての項目を実行します (これは正常に機能します)。
  3. 別のサブクエリは、SUM()別の条件に基づいて列の数値を処理します。これも正しく機能しますが、条件を満たすレコードがない場合は を返しますNULL

(subquery1)+(subquery2) AS total最初は、subquery2 が null でない限り正常に機能し、その場合は subquery1 の結果に関係なく null になるような、2 つのサブクエリを合計したいと考えていましたtotal。私の 2 番目の考えは、2 つのサブクエリ (つまり、) の計算である 3 番目の列を作成しようとすることでしたが、(subquery1) AS count1, (subquery2) AS count2, count1+count2 AS total2 つの計算列を計算することは可能ではないと思います。問題が適用されます。

私のプログラムで2つのサブクエリ値を取得して合計する以外に、この問題に対するエレガントな解決策を誰かが持っていますか?

ありがとう!

4

4 に答える 4

11

ここで起こっている2つの問題:

  • 同じ SELECT リスト内の別の式で 1 ​​つの列エイリアスを使用することはできません。

    ただし、派生テーブル サブクエリで別名を設定し、外部クエリで使用することはできます。

  • NULL はゼロではないため、NULL で算術演算を行うことはできません。

    ただし、この関数を使用して、NULL を NULL 以外の値に「デフォルト」設定できますCOALESCE()。この関数は、最初の非 NULL 引数を返します。

次に例を示します。

SELECT *, count1+count2 AS total
FROM (SELECT *, COALESCE((subquery1), 0) AS count1, 
                COALESCE((subquery2), 0) AS count2 
      FROM ... ) t;

(派生テーブルには、この例では "t" というテーブル エイリアスを指定する必要があることに注意してください)

于 2009-05-20T19:43:26.200 に答える
3

まず、COALESCE 関数は、null の問題を処理するのに役立ちます。

ユニオンを使用してこれら 2 つのクエリを 1 つの結果セットにマージし、それをサブクエリとして扱ってさらに分析することはできますか?

それとも、私はあなたの質問を完全に理解していませんでしたか?

于 2009-05-20T19:19:36.513 に答える
1

SELECT SUM(ISNULL(myColumn, 0)) //使用する前に構文を確認してください...

これは、ゼロであるその列のインスタンスに対して null ではなく 0 を返す必要があります。

于 2009-05-20T19:19:10.277 に答える
0

言うまでもありませんが、プログラム内で使用しているので、移植性の問題から、プログラム ロジックを使用して 2 つの結果 (NULL と数値) を合計したいと思います。

COALESCE 関数が非推奨になった時期や、別の DBMS がそれをサポートしているかどうかは誰にもわかりません。

于 2011-02-28T19:35:47.420 に答える