Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/78.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
SQL:当一列具有空值而不将空值替换为0时,对3列求和?_Sql_Oracle - Fatal编程技术网

SQL:当一列具有空值而不将空值替换为0时,对3列求和?

SQL:当一列具有空值而不将空值替换为0时,对3列求和?,sql,oracle,Sql,Oracle,给定表格: ID ANOTHERID ONE TWO THREE X1 B1 15 15 - X1 B2 10 - - X2 B1 - 20 - 此查询: SELECT SUM (ONE + TWO + THREE) FROM (TABLE) GROUP BY ID, ANOTHERID 我也试过了 select

给定表格:

ID   ANOTHERID      ONE    TWO      THREE
X1       B1          15    15       -
X1       B2          10    -        - 
X2       B1          -     20       -
此查询:

SELECT SUM (ONE + TWO + THREE) FROM (TABLE)
GROUP BY ID, ANOTHERID
我也试过了

select sum(coalesce( ONE + TWO + THREE, ONE + TWO, ONE + THREE, ONE + 
THREE))
至少有一列具有空值。即使存在空值,我如何仍然添加它们?由于null和0在这里有不同的含义(null表示未启动,0表示未工作),我不想用0替换null。谢谢

一种方法是:

SELECT SUM(COALESCE(ONE, 0) + COALESCE(TWO, 0) + COALESCE(THREE, 0))
FROM (TABLE)
GROUP BY ID, ANOTHERID;
或者,如果每列中至少有一个非空值:

SELECT SUM(ONE) + SUM(TWO) + SUM(THREE)
一种方法是:

SELECT SUM(COALESCE(ONE, 0) + COALESCE(TWO, 0) + COALESCE(THREE, 0))
FROM (TABLE)
GROUP BY ID, ANOTHERID;
或者,如果每列中至少有一个非空值:

SELECT SUM(ONE) + SUM(TWO) + SUM(THREE)

您可能需要在表中添加另一列来描述员工的状态(新、旧),然后创建如下条件:

if emp_status = 'new' then
    --some code
    working_hours := null;
else
     --some code
    working_hours : 0;
end if;

您可能需要在表中添加另一列来描述员工的状态(新、旧),然后创建如下条件:

if emp_status = 'new' then
    --some code
    working_hours := null;
else
     --some code
    working_hours : 0;
end if;

时间报告表不应允许空值,员工表应具有雇用日期字段,该字段可作为报告查询中的标准。这将使您能够准确地报告管理层的期望

时间报告表不允许空值,员工表应该有一个雇用日期字段,可以在报告查询中用作标准。这将使您能够准确地报告管理层的期望

这个解决方案对我有效

select 
case when coalesce(sum(ONE), sum(TWO), sum(THREE)) is null then null else 
sum(nvl(ONE,0) + nvl(TWO,0) + nvl(THREE,0)) end as 
TOTALSUM
GROUP BY ID, ANOTHERID; 

这个解决方案对我有效

select 
case when coalesce(sum(ONE), sum(TWO), sum(THREE)) is null then null else 
sum(nvl(ONE,0) + nvl(TWO,0) + nvl(THREE,0)) end as 
TOTALSUM
GROUP BY ID, ANOTHERID; 

为什么在和中使用零是一个问题,因为它不会影响结果?您希望null有什么不同于将其视为零的效果?(或者你的意思是不想将表中的值更改为零,而不是在查询中替换它?)使用
nvl(一,0)+nvl(二,0,)+nvl(三,0)
,等等。当有空值时,你希望总数是多少?基本上,表是一个雇员表,一周内未工作的ppl将为0,而最近雇佣但未工作的人(比如他们将在几周后开始工作)将为空。所以,不要使用“使用nvl(一,0)+nvl(二,0,)+nvl(三,0),等等”。。管理层希望分别查看未工作人员(0小时)和所有新员工(空值)的列表。@Randy:如果其中一人为空,则显示为空;如果所有人(一、二、三)为空,则显示为空。如果其中一个不是null,那么求和。最终的求和查询应该分别返回值null和0。为什么在求和中使用零是一个问题,因为它不会影响结果?您希望null有什么不同于将其视为零的效果?(或者你的意思是不想将表中的值更改为零,而不是在查询中替换它?)使用
nvl(一,0)+nvl(二,0,)+nvl(三,0)
,等等。当有空值时,你希望总数是多少?基本上,表是一个雇员表,一周内未工作的ppl将为0,而最近雇佣但未工作的人(比如他们将在几周后开始工作)将为空。所以,不要使用“使用nvl(一,0)+nvl(二,0,)+nvl(三,0),等等”。。管理层希望分别查看未工作人员(0小时)和所有新员工(空值)的列表。@Randy:如果其中一人为空,则显示为空;如果所有人(一、二、三)为空,则显示为空。如果其中一个不是null,那么求和。最终的求和查询应分别返回值null和0。这是一个相当大的软件。更改架构不在此工作范围内。这是一个相当大的软件。更改架构不在此工作范围内。