在Oracle中计算多个列有什么不同?
我想计算Oracle查询中的多个列。很明显,你写它的方式有很大的不同。以下是我尝试过的两种可能性:在Oracle中计算多个列有什么不同?,oracle,Oracle,我想计算Oracle查询中的多个列。很明显,你写它的方式有很大的不同。以下是我尝试过的两种可能性: select sum(column1 + column2 + column3) from ... select sum(column1) + sum(column2) + sum(column3) from ... 表是相同的,连接是相同的,where子句是相同的,等等。但是当我运行查询时,第一个查询的结果是15481.19,第二个查询的结果是14385.69。这是一个很大的不同 如果将所有数据
select sum(column1 + column2 + column3) from ...
select sum(column1) + sum(column2) + sum(column3) from ...
表是相同的,连接是相同的,where子句是相同的,等等。但是当我运行查询时,第一个查询的结果是15481.19,第二个查询的结果是14385.69。这是一个很大的不同
如果将所有数据导出到Excel并尝试获取所有值的总和,结果与第二次查询相同。在Excel中,我尝试用多种方式将它们相加:
只是选择所有数据
计算每列的总和并将其相加
计算每行的总和并将其相加
当我尝试在代码中获取所有数据,并将它们添加到代码中而不是查询中时,我也会得到与第二次查询和Excel中相同的结果
问题在于Oracle文档中另有说明:。正如您在这个链接中看到的,他们说使用第一个查询
供参考:
为此使用了版本为12.1.0的oracle客户端。
我在OracleSQLDeveloper和Toad中都试过了。
基于这些测试,我现在知道我需要使用第二个查询来获得正确的结果,但我想了解为什么第一个查询给出的结果与预期的不同。有没有人有这方面的经验?这些查询如何可能返回不同的结果
提前谢谢 简而言之:差异很可能源于聚合函数忽略空值的事实 所以这个问题
select sum(column1 + column2 + column3) from ...
select sum(column1) + sum(column2) + sum(column3) from ...
相当于
select sum(column1 + column2 + column3)
from ...
where (column1 + column2 + column3) is not null;
因为例如1+null的结果是null
但问题是
select sum(column1 + column2 + column3) from ...
select sum(column1) + sum(column2) + sum(column3) from ...
相当于
select sum(column1) + sum(column2) + sum(column3)
from ...
where column1 is not null
or column2 is not null
or column3 is not null;
假设以下数据:
第1列|第2列|第3列
----+-----+----
1 |零|零
空| 1 |空
空|空| 1
1 | 1 | 1
然后查询:
select *
from ...
where (column1 + column2 + column3) is not null;
仅返回带有1,1,1的行,因此结果为3
但问题是
select *
from foo
where column1 is not null
or column2 is not null
or column3 is not null;
返回所有行,因此第一行、第二行和第三行的值之和的总和为6 1,第四行的总和为3。简言之:差异很可能源于聚合函数忽略空值这一事实 所以这个问题
select sum(column1 + column2 + column3) from ...
select sum(column1) + sum(column2) + sum(column3) from ...
相当于
select sum(column1 + column2 + column3)
from ...
where (column1 + column2 + column3) is not null;
因为例如1+null的结果是null
但问题是
select sum(column1 + column2 + column3) from ...
select sum(column1) + sum(column2) + sum(column3) from ...
相当于
select sum(column1) + sum(column2) + sum(column3)
from ...
where column1 is not null
or column2 is not null
or column3 is not null;
假设以下数据:
第1列|第2列|第3列
----+-----+----
1 |零|零
空| 1 |空
空|空| 1
1 | 1 | 1
然后查询:
select *
from ...
where (column1 + column2 + column3) is not null;
仅返回带有1,1,1的行,因此结果为3
但问题是
select *
from foo
where column1 is not null
or column2 is not null
or column3 is not null;
返回所有行,因此第一行、第二行和第三行的值之和的总和为6 1,第四行的总和为3。您可以看到加法运算符和sum函数处理空值的效果。如果总和包含空值,则基本上忽略这些值;但是,如果将null添加到另一个数字,则结果为null。发件人: 如果给运算符一个空操作数,则结果总是空的。唯一不遵循此规则的运算符是串联| | : 除COUNT*、GROUPING和GROUPING_ID之外的所有聚合函数都忽略空值。您可以在聚合函数的参数中使用NVL函数来替换空值。COUNT和REGR_COUNT从不返回null,而是返回数字或零。对于所有剩余的聚合函数,如果数据集不包含任何行,或者只包含作为聚合函数参数的null行,则该函数返回null 您可以看到虚拟表的效果:
create table t42 (column1, column2, column3) as
select 1, 2, 3 from dual
union all select 1, null, -3 from dual
union all select 1, null, 3 from dual;
您的查询会得到类似的效果:
select sum(column1 + column2 + column3) from t42;
SUM(COLUMN1+COLUMN2+COLUMN3)
---------------------------------------
12
select sum(column1) + sum(column2) + sum(column3) from t42;
SUM(COLUMN1)+SUM(COLUMN2)+SUM(COLUMN3)
---------------------------------------
10
如果进行列添加,您可以看到原因:
select column1, column2, column3, column1 + column2 + column3 from t42;
COLUMN1 COLUMN2 COLUMN3 COLUMN1+COLUMN2+COLUMN3
---------- ---------- ---------- ---------------------------------------
1 2 3 6
1 -3
1 2 3 6
第二个加法结果是null,而不是-2。当用两个6求和时,结果不同于将单个列的总和相加。您将看到加法运算符和求和函数处理空值的效果。如果总和包含空值,则基本上忽略这些值;但是,如果将null添加到另一个数字,则结果为null。发件人: 如果给运算符一个空操作数,则结果总是空的。唯一不遵循此规则的运算符是串联| | : 除COUNT*、GROUPING和GROUPING_ID之外的所有聚合函数都忽略空值。您可以在聚合函数的参数中使用NVL函数来替换空值。COUNT和REGR_COUNT从不返回null,而是返回数字或零。对于所有剩余的聚合函数,如果数据集不包含任何行,或者只包含作为聚合函数参数的null行,则该函数返回null 您可以看到虚拟表的效果:
create table t42 (column1, column2, column3) as
select 1, 2, 3 from dual
union all select 1, null, -3 from dual
union all select 1, null, 3 from dual;
您的查询将得到一个s
相似效应:
select sum(column1 + column2 + column3) from t42;
SUM(COLUMN1+COLUMN2+COLUMN3)
---------------------------------------
12
select sum(column1) + sum(column2) + sum(column3) from t42;
SUM(COLUMN1)+SUM(COLUMN2)+SUM(COLUMN3)
---------------------------------------
10
如果进行列添加,您可以看到原因:
select column1, column2, column3, column1 + column2 + column3 from t42;
COLUMN1 COLUMN2 COLUMN3 COLUMN1+COLUMN2+COLUMN3
---------- ---------- ---------- ---------------------------------------
1 2 3 6
1 -3
1 2 3 6
第二个加法结果是null,而不是-2。当用两个6相加时,结果不同于将各个列的总和相加。感谢您的澄清!谢谢你的澄清!