Sql server 从SQL Server表中选择期初余额和期末余额
我需要使用这些表从数据库中选择期初余额和期末余额Sql server 从SQL Server表中选择期初余额和期末余额,sql-server,sql-server-2008,select,Sql Server,Sql Server 2008,Select,我需要使用这些表从数据库中选择期初余额和期末余额 TransDate Credit Debit Datasource ------------------------------------------ 2014-01-01 5000 NULL 3 2014-01-07 NULL 2000 3 2014-01-11 5000 NULL 3 2014-02-03 5000 NULL 3 201
TransDate Credit Debit Datasource
------------------------------------------
2014-01-01 5000 NULL 3
2014-01-07 NULL 2000 3
2014-01-11 5000 NULL 3
2014-02-03 5000 NULL 3
2014-02-06 NULL 5000 4
2014-02-11 5000 NULL 3
2014-02-21 NULL 5000 4
2014-02-28 5000 NULL 3
2014-03-01 5000 NULL 3
但它给了我这个
我做错了什么
我也希望看到
TransDate Credit Debit Balance
------------------------------------------
2014-01-11 NULL NULL 8000 <- opening balance
2014-02-03 5000 NULL
2014-02-06 NULL 5000
2014-02-11 5000 NULL
2014-02-21 NULL 5000
2014-02-28 5000 NULL 13000 <- closing balance
我的问题是
Select
MAX(TransDate) TransDate, 0 Credit, 0 Debit,
SUM(ISNULL([Credit], 0) - ISNULL([Debit], 0)) AS Balance
From
Transactions
WHERE
DataSource = 4 OR DataSource = 3
AND TransDate < '2014/02/01'
UNION
Select
TransDate, Credit, Debit, 0
From
Transactions
WHERE
DataSource = 4 OR DataSource = 3
AND TransDate >= '2014/02/01' AND TransDate <= '2014/02/28'
UNION
Select
MIN(TransDate) TransDate, 0 Credit, 0 Debit,
SUM(ISNULL([Credit], 0) - ISNULL([Debit], 0)) AS Balance
From
Transactions
WHERE
DataSource = 4 OR DataSource = 3
AND TransDate >= '2014/02/01' AND TransDate <= '2014/02/28'
在SQL Server 2012+中,您将使用累计总和:
select sum(coalesce(credit, 0) - coalesce(debit, 0)) over (order by transdate) as balance
from table;
您可以使用多种方法获得第一次和最后一次平衡,例如:
with b as (
select t.* sum(coalesce(credit, 0) - coalesce(debit, 0)) over (order by transdate) as balance
from table t
)
select *
from ((select top 1 b.*
from b
order by transdate
) union all
(select top 1 b.*
from b
order by transdate desc
)
) b
您还可以获得任何中间日期的余额。您是如何得出8000的期初余额的?该报告将于2014年2月运行,因此我添加了所有贷方-所有借方。您可以在2月1日之前看到两个credit 5000和一个debit 2000谢谢,但这在sql server 2008中不起作用,我收到一个错误消息102,级别15,状态1,第2行“order”附近的语法不正确。Msg 156,15级,状态1,第8行关键字“union”附近语法不正确。