Sql 基于表中的指标(a/b)列查找列值之和的差
上述代码仅在存在总贷记和总贷记对应值的情况下计算差异 公式为贷项借方=差额。问题是一些事务只有一个,而另一个为空。因此,在添加null之后,结果为null 我的愿望是,它应该为任何空值显示零,并且能够执行减法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
请帮助。尝试对
总和进行合并
尝试对总和进行合并
为了使代码的更改最少,您需要移动到有合并()
语句的地方
将它们移到子查询之外,而不是移到子查询内部
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(),而不是反过来。仅返回聚合函数的查询将始终返回一行,即使没有匹配的记录。它可能也更容易阅读。