我在做一个合同的管理程序。。其中需要对门市租金的缴纳作出统计,输入条件为一时间段,门市代码(可选),然后统计出该时间段内每月门市(若有输入门市代码,则为此门市)应缴纳的租金。这样的数据库应该怎么设计呢?
我现在的库结构如下:
一个门市代码表 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<=@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>=@fdate and TDATE<=@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)>