100分,求个存储过程和视图,谢谢

sonywinb1 2008-03-07 10:25:22
表结构如下:
sprk(dspid int,dspcode char(12),dspck char(12),ruku decimal(10,3),chuku decimal(10,3),jiecun decimal(10,3),riqi char(10))
primary key [dspid]
riqi dspid dspcode dspck ruku chuku jiecun
2006-01-01 1 11010012 11010012 10 0 50
2006-01-21 2 11010012 11010012 0 30 20
2006-01-21 3 11010012 11010012 10 0 30
2006-02-16 …
其中, ruku 是表示入库,chuku 表示出库,jiecuny 表示结存
1.用存储过程来查询某个日期(riqi)的某个商品(dspcode) 的结存
2.当更新jiecun 时,可以自动数据插入到其他的表中
3.写个视图根据dspcode来查询他的交易明细.
4.其中数据为商品的业务流水库,以dspid值为业务发生顺序,字段jiecun=上一行的jiecun+本行的ruku-本行的chuku
写一存储过程完成此表的计算逻辑,第一行数据计算时因其上一行不存在以给存储过程传递的参数为准(如表格中的第一行数据其参数即为40)
...全文
89 点赞 收藏 13
写回复
13 条回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
pt1314917 2008-03-07

--4、其中数据为商品的业务流水库,以dspid值为业务发生顺序,字段jiecun=上一行的jiecun+本行的ruku-本行的chuku
---try:


select a.riqi,a.dspid,a.dspcode,a.dspck,a.ruku,a.chuku,jiecun=isnull(b.jiecun,0)+a.ruku-a.chuku from @sprk a left join @sprk b
on a.dspid=b.dspid+1

回复
wlinglong 2008-03-07
第四个语句都有了 直接把语句改写成存储过程就OK了
回复
sonywinb1 2008-03-07
顶起来,请问,第四个如何用存储过程实现呢?
回复
wlinglong 2008-03-07

----表

CREATE TABLE [dbo].[sprk] (
[dspid] [int] NOT NULL ,
[dspcode] [char] (12) COLLATE Chinese_PRC_CI_AS NULL ,
[dspck] [char] (12) COLLATE Chinese_PRC_CI_AS NULL ,
[ruku] [decimal](10, 3) NULL ,
[chuku] [decimal](10, 3) NULL ,
[jiecun] [decimal](10, 3) NULL ,
[riqi] [char] (10) COLLATE Chinese_PRC_CI_AS NULL
) ON [PRIMARY]
GO

ALTER TABLE [dbo].[sprk] WITH NOCHECK ADD
CONSTRAINT [PK_sprk] PRIMARY KEY CLUSTERED
(
[dspid]
) ON [PRIMARY]
GO

Insert Into sprk (riqi,dspid,dspcode,dspck,ruku,chuku,jiecun )
Select '2006-01-01' ,1 ,11010012 ,11010012 ,10 ,0, 50
union
select '2006-01-21',2 ,11010012 ,11010012 ,0 ,30 ,20
union
select '2006-01-21', 3, 11010012, 11010012, 10, 0 ,30
GO

其中, ruku 是表示入库,chuku 表示出库,jiecuny 表示结存
1.用存储过程来查询某个日期(riqi)的某个商品(dspcode) 的结存
2.当更新jiecun 时,可以自动数据插入到其他的表中
3.写个视图根据dspcode来查询他的交易明细.
4.其中数据为商品的业务流水库,以dspid值为业务发生顺序,字段jiecun=上一行的jiecun+本行的ruku-本行的chuku
写一存储过程完成此表的计算逻辑,第一行数据计算时因其上一行不存在以给存储过程传递的参数为准(如表格中的第一行数据其参数即为40)


---1.
CREATE PROCEDURE cx @as_ri varchar(100) , @as_sp varchar(100)
AS
begin
select * From sprk where riqi = @as_ri and dspid = @as_sp
end

---2
CREATE TRIGGER cftj ON [dbo].[sprk]
FOR UPDATE
AS
begin

end

----44
update sprk
set jiecun =(select isnull(sum(ruku - chuku),0)
from sprk tt
where TT.riqi<=sprk.riqi)

select * from sprk

几乎就是这个意思 没有特别相信的代码
回复
dawugui 2008-03-07
4.其中数据为商品的业务流水库,以dspid值为业务发生顺序,字段jiecun=上一行的jiecun+本行的ruku-本行的chuku
写一存储过程完成此表的计算逻辑,第一行数据计算时因其上一行不存在以给存储过程传递的参数为准(如表格中的第一行数据其参数即为40)

参考:

例:有一个收支表(szb)如下结构

日期(RQ),...项目(XM),收入, 支出
2006.10.01 收工资 500
2006.10.02 付房租 200
2006.10.03 购物 50

目标说明: 要用一条SQL语句生成结果集如下(比上表多一个结余)
每条记录的 结 = 上一条记录的结余+当前记录收入-当前记录支出

日期(RQ),...项目(XM),收入, 支出
2006.10.01 收工资 500
2006.10.02 付房租 200
2006.10.03 购物 50

declare @t table (
收支日期RQ datetime,
收支项目XM varchar(20),
收入金额SL int,
支出金额ZC int
)
insert @t
select '2006.10.01','收工资',500,0 union all
select '2006.10.02','付房租',0,200 union all
select '2006.10.03','购物支出',0,50


select 收支日期RQ , 收支项目XM , 收入金额SL , 支出金额ZC , 结余JY = isnull(收入金额SL - 支出金额ZC ,0) into #temp from @t

update #temp
set 结余JY=(select isnull(sum(收入金额SL - 支出金额ZC),0)
from #temp tt
where TT.收支日期RQ<=#temp.收支日期RQ)
select convert(varchar(10),收支日期RQ,120) as 收支日期RQ , 收支项目XM , 收入金额SL , 支出金额ZC , 结余JY from #temp

drop table #temp


--结果
收支日期RQ 收支项目XM 收入金额SL 支出金额ZC 结余JY
---------- ---------- ---------- ---------- -----------
2006-10-01 收工资 500 0 500
2006-10-02 付房租 0 200 300
2006-10-03 购物支出 0 50 250

(所影响的行数为 3 行)
回复
dawugui 2008-03-07
3.写个视图根据dspcode来查询他的交易明细.
直接查询即可,不需要视图.

select * from sprk where dspcode = '某值'
回复
dawugui 2008-03-07
2.当更新jiecun 时,可以自动数据插入到其他的表中

--

这个使用触发器实现.

大致方法如下,自己参照着改.

USE pubs
IF EXISTS (SELECT name FROM sysobjects
WHERE name = 'reminder' AND type = 'TR')
DROP TRIGGER reminder
GO
CREATE TRIGGER reminder
ON titles
FOR INSERT, UPDATE
AS RAISERROR (50009, 16, 10)
GO
回复
dawugui 2008-03-07
1.用存储过程来查询某个日期(riqi)的某个商品(dspcode) 的结存


--好象这两都可以.
select 结存 = sum(ruku - chuku) from sprk where riqi <= '某日期' and dspcode = '某商品'
select 结存 = jiecuny from sprk where riqi = '某日期' and dspcode = '某商品'
回复
dawugui 2008-03-07
看看先.
回复
-狙击手- 2008-03-07
2.当更新jiecun 时,可以自动数据插入到其他的表中


--

触发器
回复
-狙击手- 2008-03-07
1.用存储过程来查询某个日期(riqi)的某个商品(dspcode) 的结存

--
create proc proc_name
@rq datetime,@dspcode varchar(10),@ret int = 0
as
select @ret = jiecun from sprk where datediff(d,rirq,@rq) = 0 and dspcode = @dspcode
go
回复
-狙击手- 2008-03-07
SF
回复
-狙击手- 2008-03-07
create table ta(riqi datetime,dspid int, dspcode int,dspck int,ruku int,chuku int,jiecun int)
insert ta select
'2006-01-01', 1, 11010012, 11010012, 10, 0 ,0 union select
'2006-01-21', 2, 11010012, 11010012, 0 ,30, 0 union select
'2006-01-21', 3, 11010012 ,11010012, 10 ,0 ,0

select * from ta

go
create proc proc_test
@ruku int,
@chuku int,
@jiecun int
as
begin
update a
set jiecun = isnull((select sum(ruku + jiecun - chuku) from ta where dspid <= a.dspid),0) +@ruku +@jiecun - @chuku
from ta a
end
go

exec proc_test 0,0,40

select * from ta
/*
(所影响的行数为 3 行)

riqi dspid dspcode dspck ruku chuku jiecun
------------------------------------------------------ ----------- ----------- ----------- ----------- ----------- -----------
2006-01-01 00:00:00.000 1 11010012 11010012 10 0 0
2006-01-21 00:00:00.000 2 11010012 11010012 0 30 0
2006-01-21 00:00:00.000 3 11010012 11010012 10 0 0

(所影响的行数为 3 行)


(所影响的行数为 3 行)

riqi dspid dspcode dspck ruku chuku jiecun
------------------------------------------------------ ----------- ----------- ----------- ----------- ----------- -----------
2006-01-01 00:00:00.000 1 11010012 11010012 10 0 50
2006-01-21 00:00:00.000 2 11010012 11010012 0 30 20
2006-01-21 00:00:00.000 3 11010012 11010012 10 0 30

(所影响的行数为 3 行)

*/
drop table ta

drop proc proc_test

回复
相关推荐
发帖
MS-SQL Server
创建于2007-09-28

3.3w+

社区成员

MS-SQL Server相关内容讨论专区
申请成为版主
帖子事件
创建了帖子
2008-03-07 10:25
社区公告
暂无公告