日期:2014-05-18  浏览次数:20491 次

SQL 余额
谢谢大家,
SQL code

表t1
账号 日期    收入 支出
A1 2011/6/10 200 0
A1 2012/6/11 0 100
A2 2012/6/10 100 0
A2 2012/6/11 100 0
A1 2012/6/14 0   100  
A1 2012/6/15 300 0

表t2
账号 日期      今日余额 
A1 2011/6/10 
A1 2012/6/11 
A2 2012/6/10 
A2 2012/6/11 
A1 2012/6/14  
A1 2012/6/15 




谢谢小F

今日余额=初期的余额+收入-支出
怎么求今日余额噢?


------解决方案--------------------
SQL code
----------------------------
-- Author  :fredrickhu(小F,向高手学习)
-- Date    :2012-06-15 11:34:31
-- Version:
--      Microsoft SQL Server 2008 R2 (RTM) - 10.50.1617.0 (Intel X86) 
--    Apr 22 2011 11:57:00 
--    Copyright (c) Microsoft Corporation
--    Enterprise Edition on Windows NT 6.1 <X64> (Build 7600: ) (WOW64)
--
----------------------------
--> 测试数据:[t1]
if object_id('[t1]') is not null drop table [t1]
go 
create table [t1]([账号] varchar(2),[日期] datetime,[收入] int,[支出] int)
insert [t1]
select 'A1','2011/6/10',200,0 union all
select 'A1','2012/6/11',0,100 union all
select 'A2','2012/6/10',100,0 union all
select 'A2','2012/6/11',100,0 union all
select 'A1','2012/6/14',0,100 union all
select 'A1','2012/6/15',300,0
--> 测试数据:[t2]
if object_id('[t2]') is not null drop table [t2]
go 
create table [t2]([账号] varchar(2),[日期] datetime,[今日余额] sql_variant)
insert [t2]
select 'A1','2011/6/10',null union all
select 'A1','2012/6/11',null union all
select 'A2','2012/6/10',null union all
select 'A2','2012/6/11',null union all
select 'A1','2012/6/14',null union all
select 'A1','2012/6/15',null
--------------开始查询--------------------------
select
 a.账号,a.日期,
 isnull((select sum(收入-支出) from t1 where 账号=a.账号 and 日期<a.日期),0) as 今日余额
from
 t1 a join t2 b
on
 a.账号=b.账号 and a.日期=b.日期
order by 
 日期

----------------结果----------------------------
/* 账号   日期                      今日余额
---- ----------------------- -----------
A1   2011-06-10 00:00:00.000 0
A2   2012-06-10 00:00:00.000 0
A2   2012-06-11 00:00:00.000 100
A1   2012-06-11 00:00:00.000 200
A1   2012-06-14 00:00:00.000 100
A1   2012-06-15 00:00:00.000 0

(6 行受影响)
*/

------解决方案--------------------
SQL code

--> 测试数据:[表t1]
if object_id('[表t1]') is not null 
drop table [表t1]
create table [表t1](
[账号] varchar(2),
[日期] datetime,
[收入] int,
[支出] int
)
go
insert [表t1]
select 'A1','2011/6/10',200,0 union all
select 'A1','2012/6/11',0,100 union all
select 'A2','2012/6/10',100,0 union all
select 'A2','2012/6/11',100,0 union all
select 'A1','2012/6/14',0,100 union all
select 'A1','2012/6/15',300,0
go
select 
    [账号],
    [日期],
    [收入],
    [支出],
    (select SUM(isnull([收入],0)-isnull([支出],0))
        from [表t1] b where a.[账号]=b.[账号] and b.日期<=a.日期) as [今日余额],
    isnull((select SUM(isnull([收入],0)-isnull([支出],0))
        from [表t1] b where a.[账号]=b.[账号] and b.日期<a.日期),0) as [昨日余额]
from 
    [表t1] a
order by 
    [账号],[日期]
/*
账号    日期    收入    支出    今日余额    昨日余额
---------------------
A1    2011-06-10 00:00:00.000    200    0    200    0
A1    2012-06-11 00:00:00.000    0    100    100    200
A1    2012-06-14 00:00:00.000    0    100    0    100
A1    2012-06-15 00:00:00.000    300    0    300    0
A2    2012-06-10 00:00:00.000    100    0    100    0
A2    2012-06-11 00:00:00.000    100    0    200    100
*/