|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
从理论上讲,完全可以为数据表里的每个字段分别建一个索引,但MySQL把同一个数据表里的索引总数限制为16个。
原帖地点:
http://community.csdn.net/Expert/topic/3485/3485588.xml?temp=.8813745
--示例数据
createtablesale(datedatetime,codevarchar(10),amtint)
insertsaleselect2004-10-22,aa,15000
unionallselect2004-10-22,bb,18000
unionallselect2004-10-22,cc,20000
unionallselect2004-10-23,aa,21000
unionallselect2004-10-23,bb,18500
unionallselect2004-10-23,cc,19600
createtabledept(codevarchar(10),namevarchar(10))
insertdeptselectaa,西餐厅
unionallselectbb,中餐厅
unionallselectcc,客房部
unionallselectdd,KTV部
createtablecost(datedatetime,codevarchar(10),amtint)
insertcostselect2004-10-22,aa,5000
unionallselect2004-10-22,bb,7000
unionallselect2004-10-22,cc,11000
unionallselect2004-10-23,aa,12000
unionallselect2004-10-23,bb,8500
unionallselect2004-10-23,cc,9600
createtablemeans(codevarchar(10),seqint,[desc]varchar(10),formulanvarchar(4000))
insertmeansselectaa,1,发卖支出,^sale@amt^
unionallselectaa,2,发卖本钱,^cost@amt^
unionallselectaa,3,上交利润,([1]-[2])*0.3
unionallselectaa,4,净利润,[1]-[2]-[3]
go
/*--成绩处置请求形貌
写一个盘算的存储历程,完成依据各基本材料及盘算办法,将数据放到利润明细表中!
如用户输出的查询前提是部门代号aa(@code),日期为:2004-10-22(@date)
则处置历程以下,
1:从利润盘算办法表(means)读取code=aa光临时表
select*into#tempfrommeanswherecode=@codeorderbyseq
2:用游标轮回处置每个项目,按seq从小到年夜的按次,如第一个项目
insertintogain_detail(code,date,desc,amt)
select@code,@date,@desc,sale.amtfromsalewherecode=@codeanddate=@date
别的项目相似
公式申明:
1.^表名@字段名^:比方:^sale@amt^暗示从sale表取amt字段的值,取值前提是code=@codeanddate=@date
2.[seq]:比方:[1]-[2]-[3],[]之间为援用本部门后面的盘算了局项,[1]暗示是本部门的发卖支出[2]暗示发卖本钱,别的相似
3.其他的是尺度的盘算表达式
--*/
--成绩处置:
--公式盘算的存储历程
createprocp_calc
@formulanvarchar(4000),--要盘算的公式
@codevarchar(10),--部门代码
@datedatetime,--盘算的日期
@amtintout--盘算的了局
as
declare@s1nvarchar(4000),@s2nvarchar(4000),@iint,@jint
--内部盘算
set@i=patindex(%^%@%^%,@formula)
while@i>0
begin
select@j=charindex(@,@formula,@i)
,@s1=substring(@formula,@i,@j-@i)
,@s2=from
+substring(@formula,@i+1,@j-@i-1)
+wherecode=@codeanddate=@date
,@i=charindex(^,@formula,@j)
,@s1=@s1+substring(@formula,@j,@i-@j+1)
,@s2=select@amt=
+substring(@formula,@j+1,@i-@j-1)
+@s2
execsp_executesql@s2
,N@codevarchar(10),@datedatetime,@amtintout
,@code,@date,@amtout
select@formula=replace(@formula,@s1,@amt)
,@i=patindex(%^%@%^%,@formula)
end
--盘算外部公式
select@i=patindex(%[[]%]%,@formula)
while@i>0
begin
select@j=charindex(],@formula,@i)
,@s1=substring(@formula,@i,@j-@i+1)
,@s2=select@amt=amtfrom#twhereseq=
+substring(@formula,@i+1,@j-@i-1)
execsp_executesql@s2,N@amtintout,@amtout
select@formula=replace(@formula,@s1,@amt)
,@i=patindex(%[[]%]%,@formula)
end
--盘算终极了局
set@s2=select@amt=+@formula
execsp_executesql@s2,N@amtintout,@amtout
go
--盘算利润明细材料的
createprocp_qry
@codevarchar(10),--要盘算的部门代码
@datedatetime--盘算的日期
as
setnocounton
createtable#t(codevarchar(10),datevarchar(10),[desc]varchar(10),amtint,seqint)
declare@dtvarchar(10),@descvarchar(10),@amtint,@formulanvarchar(4000),@seqint
set@dt=convert(char(10),@date,120)
declaretbcursorlocalfor
select[desc],formula,seqfrommeans
wherecode=@codeorderbyseq
opentb
fetchtbinto@desc,@formula,@seq
while@@fetch_status=0
begin
--盘算公式
execp_calc@formula,@code,@date,@amtout
insert#tvalues(@code,@dt,@desc,@amt,@seq)
fetchtbinto@desc,@formula,@seq
end
closetb
deallocatetb
select部门代号=code,日期=date,项目内容=[desc],金额=amtfrom#t
go
--挪用
execp_qryaa,2004-10-22
go
--删除测试
droptablesale,dept,cost,means
dropprocp_qry,p_calc
go
/*--测试了局
部门代号日期项目内容金额
-----------------------------------------
aa2004-10-22发卖支出15000
aa2004-10-22发卖本钱5000
aa2004-10-22上交利润3000
aa2004-10-22净利润7000
--*/
用一个库#bak_database存放这些历史数据。 |
|