合同管理系统中,关于统计门市每月租金缴纳的语句(存储过程,时间段)

我在做一个合同的管理程序。。其中需要对门市租金的缴纳作出统计,输入条件为一时间段,门市代码(可选),然后统计出该时间段内每月门市(若有输入门市代码,则为此门市)应缴纳的租金。这样的数据库应该怎么设计呢?

我现在的库结构如下:

一个门市代码表 TAB_MSDM :存储现有门市,MSDM不重复,ID为自动编号

TAB_MSDM

ID MSDM SSDQ...
1 A 北京...
2 B 上海...
3 C 天津...
4 D 河北...

一个用来存储门市的缴纳规则表TAB_JNGZ:表示某家门市在某段时间内,租金缴纳的方式,如月付,季付,半年付,一年付,以及每次的应付款,第一次的付款时间。每个规则之间的时间不交叉。

TAB_JNGZ

ID MSDM FDATE TDATE JDATE JE FS
1 A 2003-1-1 2003-3-31 2003-1-10 20000 月付
2 B 2003-2-1 2003-4-30 2003-2-10 15000 月付
3 C 2003-1-5 2003-7-4 2003-1-10 50000 季付
4 A 2003-4-1 2003-6-30 2003-4-5 55000 季付

现在想查寻门市 A 在 2003-1-1 到 2003-8-31 每月的应付金额,结果应为如下:

ID MSDM SJ JE
1 A 2003-1-10 20000
2 A 2003-2-10 20000
3 A 2003-3-10 20000
4 A 2003-4-5 55000

(若同样的条件,查询门市 D 时,应为空记录,因 TAB_JNGZ 表中无缴纳规则)

请帮忙写一下查询语句,或对此数据库设计提一些看法,谢谢!
---------------------------------------------------------------
eru 解答

--建立测试环境
create table TAB_JNGZ
(
ID int identity,
MSDM char(10),
FDATE datetime,
TDATE datetime,
JDATE datetime,
JE float,
FS char(10)
)

insert into TAB_JNGZ values('A','20030101','20030331','20030110',20000,'月付')
insert into TAB_JNGZ values('B','20030201','20030430','20030210',15000,'月付')
insert into TAB_JNGZ values('C','20030105','20030704','20030110',50000,'季付')
insert into TAB_JNGZ values('A','20030401','20030630','20030405',55000,'季付')

select * from tab_jngz

--创建临时表
create table #ttt
(
ID int identity,
MSDM char(10),
SJ datetime,
JE float
)

--获取数据
declare @cnt int
set @cnt=0
while(1=1)
begin
insert into #ttt(msdm,sj,je)
(select MSDM,(case FS when '月付' then dateadd(month,1*@cnt,JDATE)
when '季付' then dateadd(month,3*@cnt,JDATE)
when '半年付' then dateadd(month,6*@cnt,JDATE)
when '年付' then dateadd(year,1*@cnt,JDATE) end), JE
from tab_jngz
where (case FS when '月付' then dateadd(month,1*@cnt,JDATE)
when '季付' then dateadd(month,3*@cnt,JDATE)
when '半年付' then dateadd(month,6*@cnt,JDATE)
when '年付' then dateadd(year,1*@cnt,JDATE) end)

 1<tdate) #t="" #tab_jngz="" #tab_jngz,(select="" #ttt="" 'a','2003-1-1','2003-3-31','2003-1-10',20000,'月付'="" 'a','2003-4-1','2003-6-30','2003-4-5',55000,'季付'="" 'a','北京'="" 'b','2003-2-1','2003-4-30','2003-2-10',15000,'月付'="" 'b','上海'="" 'c','2003-1-5','2003-7-4','2003-1-10',50000,'季付'="" 'c','天津'="" 'd','河北'="" '半年付'="" '季付'="" '年付'="" '月付'="" (="" (case="" (month(fdate)-1)="" (month(tdate)-1)="" (select="" )="" *="" ,a.je="" ,fdate="" ,sj="case" --查询的开始时间="" --查询的结束时间="" --查询的门市代码="" 1="" 12="" 3+1="" @@rowcount="0" @cnt="@cnt+1" @fdate="" @msdm="" @tdate="" \---------------------------------------------------------------="" \--一个用来存储门市的缴纳规则表="" \--一个门市代码表="" \--下面是数据处理测试="" \--删除测试环境="" \--建立测试环境="" a)="" a,#t="" a.fs="" a.jdate="" a.msdm="" all="" and="" as="" b="" b.id="" between="" break="" case="" char(10)="" char(10),="" count(*)="" create="" dateadd(month,(b.id-1)*3,a.jdate)="" dateadd(month,1*rowid,jdate)="" dateadd(month,3*rowid,jdate)="" dateadd(month,6*rowid,jdate)="" dateadd(month,b.id-month(a.jdate),a.jdate)="" dateadd(year,1*rowid,jdate)="" datetime,="" datetime,jdate="" datetime,je="" datetime,tdate="" decimal(20,0),fs="" drop="" else="" end="" end),="" end)<tdate="" fdate="" float,="" from="" fs="" go="" id="identity(int,1,1)" id<a.id)="" identity(1,1),msdm="" identity,="" if="" insert="" int="" into="" isnull(@msdm,'')="" jdate="" je="" month(fdate)="" month(tdate)="" msdm="a" msdm,(case="" p_qry="" pengdali="" proc="" rowid="" select="" syscolumns="" sysobjects="" tab_jngz="" tab_jngz(id="" tab_msdm="" tab_msdm(id="" table="" tdate="" then="" top="" union="" values('a','20030101','20030331','20030110',20000,'月付')="" values('a','20030401','20030630','20030405',55000,'季付')="" values('b','20030201','20030430','20030210',15000,'月付')="" values('c','20030105','20030704','20030110',50000,'季付')="" varchar(1)="null" varchar(1),ssdq="" varchar(10))="" varchar(20))="" when="" where="" zjcxc="" 解答:="" 解答:(这是较理想的结果)="">=@fdate and TDATE&lt;=@tdate   
 2order by a.msdm   
 3else   
 4select a.msdm   
 5,sj=case a.fs when '月付' then dateadd(month,b.id-month(a.JDATE),a.JDATE)   
 6when '季付' then dateadd(month,(b.id-1)*3,a.jdate)   
 7else a.JDATE end   
 8,a.je   
 9from TAB_JNGZ a,#t b   
10where b.id between   
11case a.fs when '月付' then month(FDATE)   
12when '季付' then (month(FDATE)-1)/3+1   
13else 1 end and   
14case a.fs when '月付' then month(TDATE)   
15when '季付' then (month(TDATE)-1)/3+1   
16else 1 end   
17and FDATE&gt;=@fdate and TDATE&lt;=@tdate and msdm=@msdm   
18order by a.msdm   
19go   
20  
21exec p_qry '2003-1-1','2003-8-31','A'   
22exec p_qry '2003-1-1','2003-8-31','C'   
23  
24\--删除数据测试环境   
25drop table TAB_MSDM,TAB_JNGZ   
26drop proc p_qry</tdate)>
Published At
Categories with 数据库类
Tagged with
comments powered by Disqus