2015-04-12 35 views
0

我需要这些表选择打开和关闭平衡从SQL Server表

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 

选择从数据库打开和关闭的平衡,但它给了我这个,please see here

我究竟做错了什么?

我期望太高看

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' 
+0

你是怎么想出8000的这个开头余额的? –

+0

该报告正在2014年2月运行,所以我添加了所有信用 - 所有借记卡。你可以看到两个信用5000和一个2000年前 – Smith

回答

2

在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 

您也可以获得任何中间日期的余额。

+0

前付款谢谢,但这不起作用,这在SQL服务器2008年,我得到一个错误'消息102,级别15,状态1,行2 错误的语法附近'订单' 。 Msg 156,Level 15,State 1,Line 8 关键字'union'附近的语法错误。 – Smith