Oracle中的SUM:仅当所有字段都为NULL时才返回NULL

Lia*_*m M 1 sql oracle

我有一个相当复杂的选择查询,包含两种类型的SUM表达式.简单SUM:

SUM(X)
Run Code Online (Sandbox Code Playgroud)

更复杂的SUM/CASE:

SUM(CASE WHEN TYPE IN (
    'ORANGES',
    'LEMONS',
    'LIMES')
    THEN X
    ELSE 0 END) AS SUM_CITRUS
Run Code Online (Sandbox Code Playgroud)

现在,问题在于:只有当所有求和的值都为空时,我才需要将这两个SUMS评估为NULL .如果求和的任何一个值是一个值,则需要返回总和,就好像所有空值都替换为0一样.

对于所示的案例,如何实现这一目标?我的关注点是效率和简单性.

Kir*_*tev 5

只有当求和的所有值都为空时,我才需要将这两个SUMS评估为NULL.

它将默认.只需更换0null您的ELSE条件.

    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
Run Code Online (Sandbox Code Playgroud)