在Oracle中计算多个列有什么不同?

在Oracle中计算多个列有什么不同?,oracle,Oracle,我想计算Oracle查询中的多个列。很明显,你写它的方式有很大的不同。以下是我尝试过的两种可能性: select sum(column1 + column2 + column3) from ... select sum(column1) + sum(column2) + sum(column3) from ... 表是相同的,连接是相同的,where子句是相同的,等等。但是当我运行查询时,第一个查询的结果是15481.19,第二个查询的结果是14385.69。这是一个很大的不同 如果将所有数据

我想计算Oracle查询中的多个列。很明显,你写它的方式有很大的不同。以下是我尝试过的两种可能性:

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相加时,结果不同于将各个列的总和相加。

感谢您的澄清!谢谢你的澄清!