Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/76.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
如何为日期周期编写oracle sql,以使所有天数的余额都应大于零?_Sql_Oracle - Fatal编程技术网

如何为日期周期编写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