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。这是一个相当大的软件。更改架构不在此工作范围内。这是一个相当大的软件。更改架构不在此工作范围内。