hur.cn - 华软网

 热门搜索

高手来帮我建个变态视图,对我来说太难了. 实现了再加200分,我在这里级别不够直接出怎么多分 ,数据库是oracle 8i

  作者:未知    来源:网络    更新时间:2017/12/5
现在我有一个表AC_WASTEBOOK(帐户流水信息表),结构如下
serialno    integer 流水顺序号用来做主键
clientid    integer 帐户编号
thisbargain  money  当前交易额
usenum      integer 当前交易次数(对于每个帐号编号都从1开始累加)

这个表记录着没次交易的交易信息.

我需要建立一个视图.
serialno    integer 流水顺序号用来做主键(这个视图里不要也行.用下面的字段做联合主键)
clientid    integer 帐户编号
usenum      integer 帐户流水信息表中,改帐户编号下usenum中断的数值.

就是想找出每个帐户编号的usenum 在 帐户流水表中不存在的数值.

举个数据例子
帐户流水信息表中有数据如下
serialno  ,  clientid  ,  thisbargain  ,  usenum  
1         ,  1         ,  10           ,  1
2         ,  1         ,  10           ,  2
3         ,  1         ,  10           ,  4   //这里3没有
4         ,  2         ,  10           ,  1
5         ,  2         ,  10           ,  4   //这里2,3没有
6         ,  2         ,  10           ,  5

想要视图的结果是(就是上面表中没有的数据)
clientid    ,  usenum  
1           ,  3
2           ,  2
2           ,  3
------华软网友回答------
建议改用其他方法,比如临时表.
------华软网友回复------
如果是用DW应该可以实现,逐行扫描一遍,如果"当前行的usernum = 上一行的usernum + 1",则跳过继续处理下一条,否则,则用将"上一行的usernum "循环加 1 ,直至等于本行usernum 即可,在循环过程中将中间值记录下来在另外一个DW中显示即可
------华软网友回复------
fetch游标

+ 一临时表

表中加一自增字段indentity

比较indentity和usenum ,如断档,则取indentity作为usenum ,上一条clientid作为clientid,
如果取出的usenum为1,则drop临时表,重建,即重新indentity的计数

大概要写个存储过程了
------华软网友回复------
oracle不熟,试试到oracle版问吧
------华软网友回复------
这个实在不难吧。就是循环判断,如果存在不连续的就输出就可以了啊。
------华软网友回复------
写这个视图,不利用临时表似乎有点难,思考中。。。
------华软网友回复------
用存储过程估计好一点~~~view应该也建的出来吧~show me time~
------华软网友回复------
这个问题感觉放到DW里更顺手些,不过在数据库里处理思路也一样,都是要逐行记录判断
------华软网友回复------
在下水平有限,有视图实现不了...写了个存储过程,也不太灵活...楼主试当给分吧...

执行后结果是,如果发现有错误或不明的地方与我联系
clientid    ,  usenum  
1           ,  3
2           ,  2
2           ,  3

create proc p_try
as

--取客户编号
declare client cursor for 
select distinct clientid
from AC_WASTEBOOK

--临时变量表,存放最后结果
declare @temp table (clientid int, usenum int)

declare @client integer , --客户编号
@cnt integer ,    --表内存放最大交易编号
@num integer      --累加器,存放从1至最大编号

open client

fetch next from client into @client

while @@fetch_status = 0
begin
--取最大交易编号
select @cnt = max(usenum)
from ac_wastebook
where clientid = @client

--累加器从1计数
set @num = 1

--取小于最大交易编号的连续号
while @num <= @cnt
begin

--将不存在的编号写入临时表
if not exists(
select 1
from ac_wastebook
where clientid = @client
and usenum = @num

insert into @temp
values(@client , @num)

set @num = @num + 1
end

fetch next from client into @client
end

close client

DEALLOCATE client

select * from @temp 

go
------华软网友回复------
另外,上面那个我是用sqlserver写的..转成oracle可能需要修改一点语法.我对oracle的语法不熟..只有请高手了...
------华软网友回复------
用存储过程应该可以,但用视图估计比较难!
------华软网友回复------
是啊,存储过程好实现,视图还是想不出来...      
华软声明:本内容来自网络,如有侵犯您版权请来信指出,本站立即删除。