运行余额的sql查询

Posted

技术标签:

【中文标题】运行余额的sql查询【英文标题】:sql query for Running balance 【发布时间】:2014-06-02 01:29:13 【问题描述】:

我还是 sql 新手,我需要你的帮助,我有一个看起来像这样的表

ses_date trx_no 金额 02-04-2014 27487776I 1000 03-05-2014 27485776Y -500 01-02-2014 65474645H 4500 09-01-2014 65474656D -3400

我需要这样的输出

ses_date trx_no amount 借方 贷方 余额 2014 年 2 月 4 日 27487776I 1000 0.00 1000.00 1000 03-05-2014 27485776Y -500 -500 0.00 500 01-02-2014 65474645H 4500 0.00 4500.00 5000 09-01-2014 65474656D -3400 -3400.00 0.00 1600

就像对帐单一样,但在我自己的情况下,我没有单独的借方和贷方,它们是在一起的。

非常感谢您的帮助和支持,您是最棒的。我的 DBMS 是 microsoft SQL server 2008。我尝试使用此查询

SELECT ses_date, trx_no, amount, 
  CASE WHEN amount<0 THEN amount ELSE 0 END debit,
  CASE WHEN amount>0 THEN amount ELSE 0 END credit,
  (SELECT SUM(amount) FROM mytable a WHERE a.ses_date<=mytable.ses_date) balance
FROM mytable
ORDER BY ses_date;

但它在余额栏中给出了(0.00)零,但借方和贷方都可以。我会怎么做。

当我使用第二个查询时

select ses_date, 
       trx_no, 
       amount, 
       case
           when amount < 0 then amount 
           else 0
       end as debit,
       case 
           when amount >= 0 then amount
           else 0 
       end as credit,
       sum(amount) over (order by ses_date) as balance
from the_table
order by ses_date

错误是

消息 102,级别 15,状态 1,第 12 行 'order' 附近的语法不正确。

我会怎么做

【问题讨论】:

你用的是什么数据库? 您按什么订购?日期没有按我看到的任何顺序排列...? SQL Server 2008 不支持窗口函数的 order by。但是您的其他解决方案确实适用于我的示例:sqlfiddle.com/#!15/c552e/3 【参考方案1】:

仅出于完整性考虑,因为 mysql 不是很... ANSI,这是一个由ses_date 订购的 MySQL 版本;

SELECT ses_date, trx_no, amount, 
  CASE WHEN amount<0 THEN amount ELSE 0 END debit,
  CASE WHEN amount>0 THEN amount ELSE 0 END credit,
  (SELECT SUM(amount) FROM mytable a WHERE a.ses_date<=mytable.ses_date) balance
FROM mytable
ORDER BY ses_date;

An SQLfiddle to test with.

【讨论】:

【参考方案2】:

您没有指定您的 DBMS,所以这是 ANSI SQL

select ses_date, 
       trx_no, 
       amount, 
       case
           when amount < 0 then amount 
           else 0
       end as debit,
       case 
           when amount >= 0 then amount
           else 0 
       end as credit,
       sum(amount) over (order by ses_date) as balance
from the_table
order by ses_date

SQLFiddle 示例:http://sqlfiddle.com/#!15/c552e/1

【讨论】:

以上是关于运行余额的sql查询的主要内容,如果未能解决你的问题,请参考以下文章

SQL 连接查询以获取借方余额不等于 0 的借方余额的项目名称、日期和总和?

sql 银行账户查询余额

如何更正此 SQL 查询?

SQL 流水账余额查询

SQL查询以跟踪新订单或旧订单中的余额变化,没有日期

sql数据库中如何能让表中一个字段的数据等于一个查询中某个字段的数据