1

2 種類の SUM 式を含むかなり複雑な選択クエリがあります。単純な合計:

SUM(X)

さらに複雑な SUM/CASE:

SUM(CASE WHEN TYPE IN (
    'ORANGES',
    'LEMONS',
    'LIMES')
    THEN X
    ELSE 0 END) AS SUM_CITRUS

さて、問題は次のとおりです。合計されたすべての値が null である場合にのみ、これらの両方の SUMS を NULL に評価する必要があります。合計された値のいずれかが値である場合、すべての null 値が 0 に置き換えられたかのように合計を返す必要があります。

示されているケースでは、これをどのように達成できますか? 私の関心事は、効率性とシンプルさです。

4

2 に答える 2

5

合計されたすべての値が null である場合にのみ、これらの両方の SUMS が NULL と評価される必要があります。

それはデフォルトでそうします。あなたの状態で交換0するだけです。nullELSE

    09:43:30 SYSTEM@dwal> ed
Wrote file S:\spool\dwal\BUFFER_SYSTEM_65.sql

  1  with t (x, y) as (
  2    select null, 1  from dual union all
  3    select null, 1  from dual union all
  4    select null, 2 from dual
  5  )
  6* select sum(x), sum(case y when 1 then x else null end ) from t
09:43:40 SYSTEM@dwal> /

    SUM(X) SUM(CASEYWHEN1THENXELSENULLEND)
---------- -------------------------------


Elapsed: 00:00:00.00
09:43:41 SYSTEM@dwal> 2
  2*   select null, 1  from dual union all
09:43:59 SYSTEM@dwal> c/null/1
  2*   select 1, 1  from dual union all
09:44:03 SYSTEM@dwal> /

    SUM(X) SUM(CASEYWHEN1THENXELSENULLEND)
---------- -------------------------------
         1                               1

Elapsed: 00:00:00.01
于 2013-08-20T01:45:38.583 に答える
0

Oracle自体はあなたが望むことをしています: for sum()、すべての要素がnullの場合、 sum() はnullを返します

したがって、次のようなことができるはずです。

SELECT FOO,
SUM(CASE 
      WHEN TYPE IN (
        'ORANGES',
        'LEMONS',
        'LIMES') THEN X
      WHEN TYPE IS NULL THEN NULL
      ELSE 0 
     END) AS SUM_CITRUS
FROM YOUR_TABLE
GROUP BY FOO

(ここでは、他にもさまざまなタイプがたくさんあると仮定します。オレンジ/レモン/ライムを X としてカウントし、他のタイプを 0 としてカウントし、null を null としてカウントします)

于 2013-08-20T01:58:10.933 に答える