如何为日期周期编写oracle sql,以使所有天数的余额都应大于零?
我无法构建逻辑以获取期间余额的不同账户应高于零如何为日期周期编写oracle sql,以使所有天数的余额都应大于零?,sql,oracle,Sql,Oracle,我无法构建逻辑以获取期间余额的不同账户应高于零 Acctno date balance 123 01-Aug-20 1000 123 02-Aug-20 500 ... ... ... 456 01-Aug-20 45000 456 02-Aug-20 (1000) 如果我们认为123个帐户在这个期间有一个贷方余额余额0。 456账户一天账户的借方余额小于零 如何构
Acctno date balance
123 01-Aug-20 1000
123 02-Aug-20 500
... ... ...
456 01-Aug-20 45000
456 02-Aug-20 (1000)
如果我们认为123个帐户在这个期间有一个贷方余额余额0。
456账户一天账户的借方余额小于零
如何构建sql?
我对上述问题的回答是:123
对于8月份,您需要检查每天的余额您可以按id和月份分组,并找到最低余额 然后,如果最小余额大于或等于零,则表示不存在负余额 在小组中 大致如下:
with mydata as (
select 123 acctno , '01/08/20' d, 1000 balance from dual
union all
select 123 acctno , '02/08/20' d, 500 balance from dual
union all
select 456 acctno , '01/08/20' d, 4500 balance from dual
union all
select 456 acctno , '02/08/20' d, -1000 balance from dual
)
select * from (
select acctno, to_char(to_date(d,'dd/mm/rrrr'),'MM'),min(balance) mm ,count(d) cnt
from mydata
group by acctno,to_char(to_date(d,'dd/mm/rrrr'),'MM')
)
where mm>=0 --and cnt=(number of days in the month)
你可以做如下的事情-
Select distinct Acctno
from mytable T1
Where T1.date between to_date('01-AUG-2020', 'DD-MON-YYYY') and to_date('31-AUG-2020', 'DD-MON-YYYY')
and not exists
(Select 1 from
mytable T2
Where T2.date between to_date('01-AUG-2020', 'DD-MON-YYYY') and to_date('31-AUG-2020', 'DD-MON-YYYY')
And T2.balance <= 0
And T1.Acctno = T2.Acctno) ;
编辑:这只是通过使用自连接实现所需输出的另一种方法。GroupBy方法也适用于这种情况。此外,我同意其他一些评论,即“日期”列是一个糟糕的名称选择,因为它是一个保留关键字。如果我没有弄错,您可以使用group by并拥有: 查询过滤8月份的表,并将余额从未下降到0以下的帐户带入
注意:date是一个语言关键字,是数据类型的名称,因此列名称的选择很差。我在查询中将其重命名为acctdate。我不明白,您如何区分123和456?这是一个唯一的数字。我想问的不是,从样本数据中,在456不存在的情况下,123的预期值是多少?对于456账户,2020年8月2日余额小于零,在我们考虑8月月份的123个账户时,余额高于零,它是否像负值?为什么它在内部有代表性?
select acctno
from mytable
where acctdate > date '2020-08-01' and acctdate < date '2020-09-01'
group by acctno
having min(balance) >= 0