运行余额的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查询的主要内容,如果未能解决你的问题,请参考以下文章