我有一个相当复杂的选择查询,它包含两种类型的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一样。
对于所显示的案例,如何实现这一目标?我关注的是效率和简单性,按顺序。
答案 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,空计数为空)