首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 数据库 > SQL Server >

分期收款的视图,怎么建立

2012-02-21 
分期收款的视图,如何建立?在线等表:stallid,costName,startdate,closedate,costtime,preday ,costprice表

分期收款的视图,如何建立?在线等
表:
stallid,costName,startdate,closedate,costtime,preday ,costprice
表数据如下
房号 费用类型 合同开始 合同截止 收费周期(月单位 ) 提前天数 金额
5F0001租金 2007-01-01 2008-12-31 12 5 40000
5F0003租金 2007-03-20 2008-11-19 6 5 20000
5F0004租金 2007-05-08 2009-04-31 3 5 60000
5F0006租金 2007-02-03 2007-08-02 2 5 40000
希望得到视图
stallid,costName,coststart,costclose,paydate,payvalue
房号 费用类型 费用开始 费用截止 应收日期 应收金额
5F0001租金 2007-01-01 2007-12-31 2007-01-01 20000
5F0001租金 2008-01-01 2008-12-31 2007-12-27 20000
5F0003租金 2007-03-20 2007-09-19 2007-03-20 6000
5F0003租金 2007-09-20 2008-03-19 2008-03-15 6000
5F0003租金 2008-03-20 2008-09-19 2008-03-15 6000
5F0003租金 2008-09-20 2008-11-19 2008-03-15 2000
......
依次类推,如何建立每期收款视图.
函数 用来计算两个日期相差月份,可以直接调用.
create function uf_GetMonthdiff(@startdate datetime,@closedate datetime)
returns int
as
begin
  declare @r int
  set @r=datediff(month,@startdate,@closedate)-1
  declare @s datetime
  set @s=dateadd(month,@r,@startdate)

  while dateadd(month,1,@s)<@closedate
  begin
  set @s=dateadd(month,1,@s)
  set @r=@r+1
  end
  if datediff(day,@s,@closedate)>15
  set @r=@r+1
  return @r
end

SELECT dbo.uf_GetMonthdiff('2007-03-20','2008-12-31') 得到21个月

[解决办法]

SQL code
create table ta(房号 varchar(10),费用类型 varchar(6),合同开始 datetime,合同截止 datetime,收费周期 int,提前天数 int,金额 int)insert ta select'5F0001','租金','2007-01-01','2008-12-31',12,5 ,            40000  union select  '5F0003','租金','2007-03-20','2008-11-19',6,5   ,          20000  union select  '5F0004','租金','2007-05-08','2009-04-30',3,5 , 60000  union select  '5F0006','租金','2007-02-03','2007-08-02',2,5     ,        40000 goselect top 20 pid = identity(int,0,1) into # from sysobjects a,sysobjects bselect 房号 ,费用类型,合同开始 = dateadd(mm,a.收费周期*pid,a.合同开始),合同截止 = dateadd(mm,a.收费周期*(pid+1),a.合同开始),应收日期 = case when pid = 0 then 合同开始                 else dateadd(d,- 提前天数 ,dateadd(mm,a.收费周期*(pid+1),a.合同开始)) endfrom ta aleft join # c on dateadd(mm,a.收费周期*pid,a.合同开始) < =a.合同截止/*房号         费用类型   合同开始                                                   合同截止                                                   应收日期                                                   ---------- ------ ------------------------------------------------------ ------------------------------------------------------ ------------------------------------------------------ 5F0001     租金     2007-01-01 00:00:00.000                                2008-01-01 00:00:00.000                                2007-01-01 00:00:00.0005F0001     租金     2008-01-01 00:00:00.000                                2009-01-01 00:00:00.000                                2008-12-27 00:00:00.0005F0003     租金     2007-03-20 00:00:00.000                                2007-09-20 00:00:00.000                                2007-03-20 00:00:00.0005F0003     租金     2007-09-20 00:00:00.000                                2008-03-20 00:00:00.000                                2008-03-15 00:00:00.0005F0003     租金     2008-03-20 00:00:00.000                                2008-09-20 00:00:00.000                                2008-09-15 00:00:00.0005F0003     租金     2008-09-20 00:00:00.000                                2009-03-20 00:00:00.000                                2009-03-15 00:00:00.0005F0004     租金     2007-05-08 00:00:00.000                                2007-08-08 00:00:00.000                                2007-05-08 00:00:00.0005F0004     租金     2007-08-08 00:00:00.000                                2007-11-08 00:00:00.000                                2007-11-03 00:00:00.0005F0004     租金     2007-11-08 00:00:00.000                                2008-02-08 00:00:00.000                                2008-02-03 00:00:00.0005F0004     租金     2008-02-08 00:00:00.000                                2008-05-08 00:00:00.000                                2008-05-03 00:00:00.0005F0004     租金     2008-05-08 00:00:00.000                                2008-08-08 00:00:00.000                                2008-08-03 00:00:00.0005F0004     租金     2008-08-08 00:00:00.000                                2008-11-08 00:00:00.000                                2008-11-03 00:00:00.0005F0004     租金     2008-11-08 00:00:00.000                                2009-02-08 00:00:00.000                                2009-02-03 00:00:00.0005F0004     租金     2009-02-08 00:00:00.000                                2009-05-08 00:00:00.000                                2009-05-03 00:00:00.0005F0006     租金     2007-02-03 00:00:00.000                                2007-04-03 00:00:00.000                                2007-02-03 00:00:00.0005F0006     租金     2007-04-03 00:00:00.000                                2007-06-03 00:00:00.000                                2007-05-29 00:00:00.0005F0006     租金     2007-06-03 00:00:00.000                                2007-08-03 00:00:00.000                                2007-07-29 00:00:00.000*/drop table ta,#
[解决办法]
不是正好
SQL code
create table ta(房号 varchar(10),费用类型 varchar(6),合同开始 datetime,合同截止 datetime,收费周期 int,提前天数 int,金额 int)insert ta select'5F0001','租金','2007-01-01','2008-12-31',12,5 ,            40000  union select  '5F0003','租金','2007-03-20','2008-11-19',6,5   ,          20000  union select  '5F0004','租金','2007-05-08','2009-04-30',3,5 , 60000  union select  '5F0006','租金','2007-02-03','2007-08-02',2,5     ,        40000 goselect top 20 pid = identity(int,0,1) into # from sysobjects a,sysobjects bselect 房号 ,费用类型,合同开始 = convert(char(10),dateadd(mm,a.收费周期*pid,a.合同开始),120),合同截止 = convert(char(10),dateadd(mm,a.收费周期*(pid+1),a.合同开始),120),应收日期 = convert(char(10),case when pid = 0 then 合同开始                 else dateadd(d,- 提前天数 ,dateadd(mm,a.收费周期*(pid+1),a.合同开始)) end,120),收费周期  ,提前天数,应收金额 = case when round(金额 / ((datediff(mm,合同开始,合同截止)+1) / 收费周期 ) -400,-3)*(pid +1)< 金额           then round(金额 / ((datediff(mm,合同开始,合同截止)+1) / 收费周期 ) -400,-3)           else 金额 - round(金额 / ((datediff(mm,合同开始,合同截止)+1) / 收费周期 ) -400,-3)*(pid ) endfrom ta aleft join # c on dateadd(mm,a.收费周期*pid,a.合同开始) < =a.合同截止/*房号         费用类型   合同开始       合同截止       应收日期       收费周期        提前天数        应收金额        ---------- ------ ---------- ---------- ---------- ----------- ----------- ----------- 5F0001     租金     2007-01-01 2008-01-01 2007-01-01 12          5           200005F0001     租金     2008-01-01 2009-01-01 2008-12-27 12          5           200005F0003     租金     2007-03-20 2007-09-20 2007-03-20 6           5           60005F0003     租金     2007-09-20 2008-03-20 2008-03-15 6           5           60005F0003     租金     2008-03-20 2008-09-20 2008-09-15 6           5           60005F0003     租金     2008-09-20 2009-03-20 2009-03-15 6           5           20005F0004     租金     2007-05-08 2007-08-08 2007-05-08 3           5           70005F0004     租金     2007-08-08 2007-11-08 2007-11-03 3           5           70005F0004     租金     2007-11-08 2008-02-08 2008-02-03 3           5           70005F0004     租金     2008-02-08 2008-05-08 2008-05-03 3           5           70005F0004     租金     2008-05-08 2008-08-08 2008-08-03 3           5           70005F0004     租金     2008-08-08 2008-11-08 2008-11-03 3           5           70005F0004     租金     2008-11-08 2009-02-08 2009-02-03 3           5           70005F0004     租金     2009-02-08 2009-05-08 2009-05-03 3           5           70005F0006     租金     2007-02-03 2007-04-03 2007-02-03 2           5           130005F0006     租金     2007-04-03 2007-06-03 2007-05-29 2           5           130005F0006     租金     2007-06-03 2007-08-03 2007-07-29 2           5           13000(所影响的行数为 17 行)*/drop table ta,# 

热点排行