【问题标题】:SUM in Oracle: return NULL only when all fields are NULLOracle 中的 SUM:仅当所有字段为 NULL 时才返回 NULL
【发布时间】:2013-08-20 09:58:10
【问题描述】:

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

SUM(X)

还有更复杂的 SUM/CASE:

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

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

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

【问题讨论】:

    标签: sql oracle


    【解决方案1】:

    只有当所有的 总和值为空。

    默认情况下会。只需在 ELSE 条件中将 0 替换为 null

        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
    

    【讨论】:

    • 啊,谢谢!看来我用于 SUM 表达式行为的参考具有误导性。只需按照您的建议进行更改即可。
    【解决方案2】:

    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)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-04-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-11-22
      • 2017-10-08
      • 2011-02-17
      • 2017-05-17
      相关资源
      最近更新 更多