1

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

SUM(X)

还有更复杂的 SUM/CASE:

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

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

对于所示的案例,如何实现?我关心的是效率和简单性,按照这个顺序。

4

2 回答 2

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
于 2013-08-20T01:45:38.583 回答
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,null 算作 null)

于 2013-08-20T01:58:10.933 回答