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”附近语法不正确。