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

时间:2013-08-20 01:25:08

标签: sql oracle

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

SUM(X)

更复杂的SUM / CASE:

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

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

对于所显示的案例,如何实现这一目标?我关注的是效率和简单性,按顺序。

2 个答案:

答案 0 :(得分:5)

  

我需要这两个SUMS仅在所有的情况下评估为NULL   总和的值为空。

默认情况下会这样。只需在0条件中将null替换为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

答案 1 :(得分:0)

Oracle本身正在做你想要的:对于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,空计数为空)