Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/83.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 Oracle查询期初和期末余额_Sql_Oracle_Oracle11g_Oracle10g - Fatal编程技术网

Sql Oracle查询期初和期末余额

Sql Oracle查询期初和期末余额,sql,oracle,oracle11g,oracle10g,Sql,Oracle,Oracle11g,Oracle10g,您好,我有下表和数据来获取每个账户的期初余额和期末余额。gdate这更像是一个评论,因为它没有回答问题。您的查询简化为: Select account_no, LAG(closing, 1 ,0) OVER (order by account_no) as opening, debit, credit, (LAG(closing,1,0) OVER (order by account_no )+ closing) as closing from (select acc

您好,我有下表和数据来获取每个账户的期初余额和期末余额。gdate这更像是一个评论,因为它没有回答问题。您的查询简化为:

Select account_no, LAG(closing, 1 ,0) OVER (order by account_no) as opening,
       debit, credit,
       (LAG(closing,1,0) OVER (order by account_no )+ closing) as closing
from (select account_no, 0 as OPEN, SUM(debit) as debit, SUM(credit) as credit,
             sum(debit) - sum(credit) as closing
      FROM ledger
      where gdate > '20-oct-13'
      group by account_no
     ) a;
一些注释<代码>子查询或CTE中的order by没有用处,除非您在下一个外部查询中选择了
rownum
。如果要对结果进行排序,请在外部查询中输入一个
orderby


查询本身没有意义。为什么期初余额来自上一个账号?通常,此类术语用于特定账户的日期,并且您已经删除了
group by
条款中的所有日期。

您不断更改您的要求,但根据您目前显示的情况,这是有效的:

select account_no,
 max(opening) keep (dense_rank first order by gdate) as opening,
 sum(debit) as debit,
 sum(credit) as credit,
 max(closing) keep (dense_rank first order by gdate desc) as closing
from (
 select account_no, gdate, credit, debit,
 lag(balance, 1, 0) over (partition by account_no order by gdate) as opening,
 balance as closing
 from (
  select account_no, gdate, debit, credit,
  sum(debit) over (partition by account_no order by gdate) as sum_debit,
  sum(credit) over (partition by account_no order by gdate) as sum_credit,
  sum(credit) over (partition by account_no order by gdate)
   - sum(debit) over (partition by account_no order by gdate) as balance
  from ledger
 )
)
where gdate > date '2013-10-02'
group by account_no
order by account_no;
这与我之前链接的逻辑相同,当你有不同的数据时

我不知道为什么你会显示你的期初余额为正;当你只有借项时,这似乎是错误的。如果这确实是您想要的,那么只需交换余额的计算方式:

...
  sum(debit) over (partition by account_no order by gdate)
   - sum(credit) over (partition by account_no order by gdate) as balance
...

.

如果您有用于相关表的ddl脚本,这将节省一些人回答此问题的时间,并意味着他们不会猜测数据类型等。我个人认为SQL FIDLE对于共享这类内容非常有用:以下是表结构创建表分类账(账户号varchar2(10)、gdate日期、借方编号(8),信用证号码(8)请你也解释一下结果出了什么问题。你以为会有几排?如果您也有DML a此数据的样本,这将很有帮助。期初和期末余额始终显示0零您希望您发布的样本数据有什么输出?我想你只能得到两行,分别是
10-0001,-4860,05310450
30-00011040352,20708
?相同的结果打开和关闭总是显示0zero@user3244687 . . . 如前所述,我没有更改您的查询。我只是评论说这毫无意义。你为什么要从另一个账户中提取余额?
select account_no,
 max(opening) keep (dense_rank first order by gdate) as opening,
 sum(debit) as debit,
 sum(credit) as credit,
 max(closing) keep (dense_rank first order by gdate desc) as closing
from (
 select account_no, gdate, credit, debit,
 lag(balance, 1, 0) over (partition by account_no order by gdate) as opening,
 balance as closing
 from (
  select account_no, gdate, debit, credit,
  sum(debit) over (partition by account_no order by gdate) as sum_debit,
  sum(credit) over (partition by account_no order by gdate) as sum_credit,
  sum(credit) over (partition by account_no order by gdate)
   - sum(debit) over (partition by account_no order by gdate) as balance
  from ledger
 )
)
where gdate > date '2013-10-02'
group by account_no
order by account_no;
...
  sum(debit) over (partition by account_no order by gdate)
   - sum(credit) over (partition by account_no order by gdate) as balance
...