求一存储过程

stone66789 2004-11-22 02:57:33
--求一存储过程
--有三个例表a,b,c
--表a结构如下:项目编号(item),项目内容(descrip),项目公式(formula)
--其中项目公式字段存储 ‘表名.字段名'
--在其引用的所有表中,均有一个bill_date datetime(单据日期字段),及dept varchar(20)部门代号字段
--如下所示,引用到的sale及salary表中均有bill_date,dept字段
create table a(item varchar(20),descrip varchar(255),formula varchar(255) )
insert into a
select 'a001','销售额','sale.amt'
union
select 'a002','材料成本金额','sala.cost'
union
select 'a003','人工费','salary.amt'
--表b结构如下:部门编号(dept),部门名称(deptname)
create table b(dept varchar(20),deptname varchar(255))
insert into b
select 'a','家电柜'
union
select 'b','五金柜'
union
select 'c','食品柜'
union
select 'd','服装柜'
--根据上两个表的内容,生成结果集到c表
--表c的结构为:部门编号,项目编号,项目值,开始日期,结束日期
create table c(dept varchar(20),item varchar(20) value numeric(20,6),bdate datetime,edate datetime)
--生成规则,根据传入的参数,是一个日期区间(即开始日期 bdate,结束日期 edate)
--先循环表a的每一个项目,在每一个项目中循环处理表b的每一个部门,将结果放到c表,
--如表b中的部门取不到对应的项目值,则写入0,最终c表的记录条数=a表记录数量*b表记录数量
--其中c表的dept来自于b表的dept,c表的item来自于a表的item
--类似的c表的确良结果集为:
'a','a001',5000, '2004-10-01','2004-10-31'
'b','a001',5500, '2004-10-01','2004-10-31'
'c','a001',15000,'2004-10-01','2004-10-31'
'd','a001',18000,'2004-10-01','2004-10-31'
'a','a002',3000, '2004-10-01','2004-10-31'
'b','a002',4000, '2004-10-01','2004-10-31'
'c','a002',10000,'2004-10-01','2004-10-31'
'd','a002',12000,'2004-10-01','2004-10-31'
'a','a003',1000, '2004-10-01','2004-10-31'
'b','a003',1100, '2004-10-01','2004-10-31'
'c','a003',3000, '2004-10-01','2004-10-31'
'd','a003',3500, '2004-10-01','2004-10-31'
--上面第三列的数字是精简需求得来,以第一条记录为例,里面的5000应是执行类似下面的语句计算出来的:
select sum(sale.amt) from sale where dept = 'a001' and bill_date between
'2004-10-01 and '2004-10-31' 计算出来!
...全文
181 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
stone66789 2004-11-23
  • 打赏
  • 举报
回复
再次请各位帮忙看看!
stone66789 2004-11-23
  • 打赏
  • 举报
回复
再次请各位帮忙看看!
stone66789 2004-11-23
  • 打赏
  • 举报
回复
高手就是高手,比我自已设想的要简洁多了,谢谢zjcxc!
zjcxc 元老 2004-11-23
  • 打赏
  • 举报
回复
--存储过程大致如下,假设你的c表已经事先建好
create proc p_insert
@dt_begin datetime, --处理的开始时间
@dt_end datetime --处理的结束时间
as
declare @s nvarchar(4000)
declare tb cursor local for
select 'insert c(dept,item,value,bdate,edate)
select b.dept,'''+item+''',sum('+formula
+'),@dt_begin,@dt_end from b left join '
+left(formula,charindex('.',formula)-1)
+' on '+left(formula,charindex('.',formula)-1)
+'.bill_date between @dt_begin and @dt_end group by b.dept'
from a
open tb
fetch tb into @s
while @@fetch_status=0
begin
exec sp_executesql @s
,N'@dt_begin datetime,@dt_end datetime'
,@dt_begin,@dt_end
fetch tb into @s
end
close tb
deallocate tb
go
stone66789 2004-11-23
  • 打赏
  • 举报
回复
再次请各位帮忙看看!
prcgolf 2004-11-22
  • 打赏
  • 举报
回复
UP
1unknow 2004-11-22
  • 打赏
  • 举报
回复
邹建名气怎么这么大!!
stone66789 2004-11-22
  • 打赏
  • 举报
回复
基本的数据已经给出了,就是结果集的第三列的数据没有给出,因为虽然涉及到的表多,但处理方法是一致的,
类似于下面的语句,只是更换表名称及字段名称了(表名称及字段名称记录在a表的项目公式字段中)
select sum(sale.amt) from sale where dept = 'a001' and bill_date between
'2004-10-01 and '2004-10-31'
再次感谢各位!
qizhanfeng 2004-11-22
  • 打赏
  • 举报
回复
最好有完整的数据
请邹建来吧
liangx326 2004-11-22
  • 打赏
  • 举报
回复
好长阿!!等老大的回复吧还是,自己看看就头晕了!
stone66789 2004-11-22
  • 打赏
  • 举报
回复
谢谢qizhanfeng
但需求不是这样的,实际比你所写的要复杂,一定会用到游标,
同时,也感谢各位的回复!
qizhanfeng 2004-11-22
  • 打赏
  • 举报
回复
create proc p_t(@b smalldatetime,@e small datetime)
as
select c.dept,c.item,sum(d.amt) as '合计',b_date,e_date from
(select dept,item, @b as b_date,@e as e_date from (a cross join b)) C left join
sale d on c.dept=d.dept
Go
davorsuker39 2004-11-22
  • 打赏
  • 举报
回复
关注
了缘 2004-11-22
  • 打赏
  • 举报
回复
等老大来吧
了缘 2004-11-22
  • 打赏
  • 举报
回复
今天头晕,没有心情,下次看,

34,590

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server相关内容讨论专区
社区管理员
  • 基础类社区
  • 二月十六
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧