Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/69.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 基于表中的指标(a/b)列查找列值之和的差_Sql_Oracle11g - Fatal编程技术网

Sql 基于表中的指标(a/b)列查找列值之和的差

Sql 基于表中的指标(a/b)列查找列值之和的差,sql,oracle11g,Sql,Oracle11g,上述代码仅在存在总贷记和总贷记对应值的情况下计算差异 公式为贷项借方=差额。问题是一些事务只有一个,而另一个为空。因此,在添加null之后,结果为null 我的愿望是,它应该为任何空值显示零,并且能够执行减法 请帮助。尝试对总和进行合并尝试对总和进行合并为了使代码的更改最少,您需要移动到有合并()语句的地方 将它们移到子查询之外,而不是移到子查询内部 select ca.cust_ac_no, ca.ccy, ah.trn_dt, (SELECT sum(COALESCE(hi.lcy_amo

上述代码仅在存在总贷记和总贷记对应值的情况下计算差异

公式为贷项借方=差额。问题是一些事务只有一个,而另一个为空。因此,在添加null之后,结果为null

我的愿望是,它应该为任何空值显示零,并且能够执行减法


请帮助。

尝试对
总和进行
合并

尝试对
总和进行
合并

为了使代码的更改最少,您需要移动到有
合并()
语句的地方

将它们移到子查询之外,而不是移到子查询内部

select ca.cust_ac_no, ca.ccy, ah.trn_dt,
(SELECT  sum(COALESCE(hi.lcy_amount,0))                                    
     FROM actb_history hi 
     WHERE hi.ac_no='0013001600038'  and hi.drcr_ind = 'C' and ah.trn_dt = hi.trn_dt
     GROUP BY hi.ac_no,hi.drcr_ind) as Total_Credits,
(SELECT  sum(COALESCE(hi.lcy_amount,0))                                    
     FROM actb_history hi 
     WHERE hi.ac_no='0013001600038'  and hi.drcr_ind = 'D'and ah.trn_dt = hi.trn_dt
     GROUP BY hi.ac_no,hi.drcr_ind) as Total_Debits,

((SELECT  sum( COALESCE(hi.lcy_amount,0))                                    
     FROM actb_history hi 
     WHERE hi.ac_no='0013001600038'  and hi.drcr_ind = 'C' and ah.trn_dt = hi.trn_dt
     GROUP BY hi.ac_no,hi.drcr_ind)
     -
(SELECT  sum(COALESCE(hi.lcy_amount,0))                                    
     FROM actb_history hi 
     WHERE hi.ac_no='0013001600038'  and hi.drcr_ind = 'D'and ah.trn_dt = hi.trn_dt
     GROUP BY hi.drcr_ind,hi.drcr_ind )) as difference

from actb_history ah, sttm_cust_account ca
where ah.ac_no='0013001600038'
and ah.ac_no = ca.cust_ac_no
group by ca.cust_ac_no,  ca.ccy, ah.trn_dt

这是因为相关子查询可能没有记录被
SUM()。在这种情况下,您没有
SUM(0)
,您一无所有(
NULL
)。因此,将
COALESCE()
放在子查询之外,会将
no records processed
转换为
0

,为了对代码进行最小的更改,您需要将
COALESCE()
语句移到哪里

将它们移到子查询之外,而不是移到子查询内部

select ca.cust_ac_no, ca.ccy, ah.trn_dt,
(SELECT  sum(COALESCE(hi.lcy_amount,0))                                    
     FROM actb_history hi 
     WHERE hi.ac_no='0013001600038'  and hi.drcr_ind = 'C' and ah.trn_dt = hi.trn_dt
     GROUP BY hi.ac_no,hi.drcr_ind) as Total_Credits,
(SELECT  sum(COALESCE(hi.lcy_amount,0))                                    
     FROM actb_history hi 
     WHERE hi.ac_no='0013001600038'  and hi.drcr_ind = 'D'and ah.trn_dt = hi.trn_dt
     GROUP BY hi.ac_no,hi.drcr_ind) as Total_Debits,

((SELECT  sum( COALESCE(hi.lcy_amount,0))                                    
     FROM actb_history hi 
     WHERE hi.ac_no='0013001600038'  and hi.drcr_ind = 'C' and ah.trn_dt = hi.trn_dt
     GROUP BY hi.ac_no,hi.drcr_ind)
     -
(SELECT  sum(COALESCE(hi.lcy_amount,0))                                    
     FROM actb_history hi 
     WHERE hi.ac_no='0013001600038'  and hi.drcr_ind = 'D'and ah.trn_dt = hi.trn_dt
     GROUP BY hi.drcr_ind,hi.drcr_ind )) as difference

from actb_history ah, sttm_cust_account ca
where ah.ac_no='0013001600038'
and ah.ac_no = ca.cust_ac_no
group by ca.cust_ac_no,  ca.ccy, ah.trn_dt

这是因为相关子查询可能没有记录被
SUM()。在这种情况下,您没有
SUM(0)
,您一无所有(
NULL
)。因此,将
COALESCE()
放在子查询之外,将
no records processed
转换为
0

,在我看来,一个简单得多的查询符合要求:

select ca.cust_ac_no, ca.ccy, ah.trn_dt,
(SELECT  sum(COALESCE(hi.lcy_amount,0))                                    
     FROM actb_history hi 
     WHERE hi.ac_no='0013001600038'  and hi.drcr_ind = 'C' and ah.trn_dt = hi.trn_dt
     GROUP BY hi.ac_no,hi.drcr_ind) as Total_Credits,
(SELECT  sum(COALESCE(hi.lcy_amount,0))                                    
     FROM actb_history hi 
     WHERE hi.ac_no='0013001600038'  and hi.drcr_ind = 'D'and ah.trn_dt = hi.trn_dt
     GROUP BY hi.ac_no,hi.drcr_ind) as Total_Debits,

COALESCE((SELECT  sum(hi.lcy_amount)                                    
     FROM actb_history hi 
     WHERE hi.ac_no='0013001600038'  and hi.drcr_ind = 'C' and ah.trn_dt = hi.trn_dt
     GROUP BY hi.ac_no,hi.drcr_ind), 0)
     -
COALESCE((SELECT  sum(hi.lcy_amount)                                    
     FROM actb_history hi 
     WHERE hi.ac_no='0013001600038'  and hi.drcr_ind = 'D'and ah.trn_dt = hi.trn_dt
     GROUP BY hi.drcr_ind,hi.drcr_ind ), 0) as difference

from actb_history ah, sttm_cust_account ca
where ah.ac_no='0013001600038'
and ah.ac_no = ca.cust_ac_no
group by ca.cust_ac_no,  ca.ccy, ah.trn_dt

在我看来,一个简单得多的查询符合要求:

select ca.cust_ac_no, ca.ccy, ah.trn_dt,
(SELECT  sum(COALESCE(hi.lcy_amount,0))                                    
     FROM actb_history hi 
     WHERE hi.ac_no='0013001600038'  and hi.drcr_ind = 'C' and ah.trn_dt = hi.trn_dt
     GROUP BY hi.ac_no,hi.drcr_ind) as Total_Credits,
(SELECT  sum(COALESCE(hi.lcy_amount,0))                                    
     FROM actb_history hi 
     WHERE hi.ac_no='0013001600038'  and hi.drcr_ind = 'D'and ah.trn_dt = hi.trn_dt
     GROUP BY hi.ac_no,hi.drcr_ind) as Total_Debits,

COALESCE((SELECT  sum(hi.lcy_amount)                                    
     FROM actb_history hi 
     WHERE hi.ac_no='0013001600038'  and hi.drcr_ind = 'C' and ah.trn_dt = hi.trn_dt
     GROUP BY hi.ac_no,hi.drcr_ind), 0)
     -
COALESCE((SELECT  sum(hi.lcy_amount)                                    
     FROM actb_history hi 
     WHERE hi.ac_no='0013001600038'  and hi.drcr_ind = 'D'and ah.trn_dt = hi.trn_dt
     GROUP BY hi.drcr_ind,hi.drcr_ind ), 0) as difference

from actb_history ah, sttm_cust_account ca
where ah.ac_no='0013001600038'
and ah.ac_no = ca.cust_ac_no
group by ca.cust_ac_no,  ca.ccy, ah.trn_dt

除了
'C'
'D'
交易之外,在
actb_历史中有什么吗?除了
'C'
'D'
交易之外,在
actb_历史中有什么吗?+1-这正是我正在写的查询。它去除了不必要的子查询并使用了适当的联接。您可能仍然希望在其中合并(sum(…),0)。@davidardridge-如果甚至只有一行(必须有一行才能进行联接),那么所有的都是
1
s和
0
s,看不到
NULL
s。是的,这是真的,但是如果没有'D'或'C'而另一个存在,那么你就有一个问题+1-这正是我写的查询。它去除了不必要的子查询并使用了适当的联接。您可能仍然希望在其中合并(sum(…),0)。@davidardridge-如果甚至只有一行(必须有一行才能进行联接),那么所有的都是
1
s和
0
s,看不到
NULL
s。是的,这是真的,但是如果没有“D”或“C”,而另一个存在,那么你就有了一个问题,谢谢,它解决了。我现在能感觉到肩上的负担。哎哟。谢谢你,你也可以用Coalesce()来包装Sum(),而不是反过来。仅返回聚合函数的查询将始终返回一行,即使没有匹配的记录。它可能也更容易阅读。非常感谢,它成功了。我现在能感觉到肩上的负担。哎哟。谢谢你,你也可以用Coalesce()来包装Sum(),而不是反过来。仅返回聚合函数的查询将始终返回一行,即使没有匹配的记录。它可能也更容易阅读。