打印本文 打印本文 关闭窗口 关闭窗口
关于在 sybase 下生成交叉报表的方法,希望能够抛砖引玉
作者:武汉SEO闵涛  文章来源:敏韬网  点击数797  更新时间:2009/4/22 23:09:45  文章录入:mintao  责任编辑:mintao

有时候在开发产品时,要为用户提供输出比较多的报表,当用户处软件配置、初始化数据设置不一致时,报表的格式可能就不一样,这样,竖表变横表(既交叉报表)就能够发挥强大的作用


--假设有一个表 归类项目表,有20个项目科目, 
create table ITEMS 
(id int not null , 
name char(20) not null 


insert into ITEMS values (1,'项目1') 
insert into ITEMS values (2,'项目2') 
insert into ITEMS values (3,'项目3') 
insert into ITEMS values (4,'项目4') 
insert into ITEMS values (5,'项目5') 
insert into ITEMS values (6,'项目6') 
insert into ITEMS values (7,'项目7') 
insert into ITEMS values (8,'项目8') 
insert into ITEMS values (9,'项目9') 
insert into ITEMS values (10,'项目10') 


---还有一个表 明细项目 
drop table ITEMDETAIL 
create table ITEMDETAIL 
( id int identity not null , 
name char(10) not null , 
price numeric(10,2) not null default 0 , 
item_id int not null 


insert into ITEMDETAIL (name,price,item_id) values ('明细项目1',10,1) 
insert into ITEMDETAIL (name,price,item_id) values ('明细项目2',10,2) 
insert into ITEMDETAIL (name,price,item_id) values ('明细项目3',10,3) 
--insert into ITEMDETAIL (name,price,item_id) values ('明细项目4',10,4) 
insert into ITEMDETAIL (name,price,item_id) values ('明细项目5',10,5) 
insert into ITEMDETAIL (name,price,item_id) values ('明细项目6',10,6) 
insert into ITEMDETAIL (name,price,item_id) values ('明细项目7',10,7) 
insert into ITEMDETAIL (name,price,item_id) values ('明细项目8',10, 
insert into ITEMDETAIL (name,price,item_id) values ('明细项目9',10,9) 
insert into ITEMDETAIL (name,price,item_id) values ('明细项目10',10,10) 



--第三个表:销售项目明细表 
drop table SALEDETAIL 
create table SALEDETAIL 
(orderno int identity not null ,--订单号 
orderdate char( not null,--日期 
invoiceno char(20) null,--发票号码 
itemdetail_id int not null, --明细项目编码 
item_id int not null, --归类大项目编码 
price numeric(10,2) not null , --价格 
num int not null, --数量 
dept_no char(6) not null, --部门 
amount numeric(10,2) not null 


--其他字段就不说了 



drop procedure usp_rpt_sale1 
go 
create procedure usp_rpt_sale1 
@date_b char(, --开始日期 
@date_e char( --截止日期 
as 
begin 
declare @sqlstr1 varchar(8000), @sqlstr2 varchar(8000) 
declare @id int , @name char(20) 
select @sqlstr1 = 'select dept_no, ' 
--声明一个游标,以该游标控制动态语句的生成
declare cursor1 cursor for 
select id ,name from ITEMS for read only 
open cursor1 
fetch cursor1 into @id, @name 
select @sqlstr1 = @sqlstr1 + 'sum(case when itemdetail_id = ' + convert(varchar,@id)+ ' then amount else 0  as '+ @name + char(13) 

fetch cursor1 into @id, @name 
while @@fetch_status = 0 
begin 
select @sqlstr1 = @sqlstr1 + ' , sum(case when itemdetail_id =' + convert(varchar,@id)+ ' then amount else 0  as '+ @name + char(13) 
fetch cursor1 into @id, @name 
end 
close cursor1 
deallocate cursor1 
--print @sqlstr1 
select @sqlstr1 = @sqlstr1+ ', sum(amount) as "小计" ' + ' from SALEDETAIL where orderdate between "'+ @date_b + '" and "'+ @date_e + '" group by dept_no ' 
print @sqlstr1 
--exec (@sqlstr1) 
end 

go 
exec usp_rpt_sale1 '20030101','20030101' 


--------------------------------------------------------------

在 sybase 12.0 支持动态 sql 的版本上才能运行!
以上是 mssql 2000 版本 ,
如果需要使用,可以改造为 sybase 版本 有几个地方需要注意:
 varchar(8000)  可以多声明几个 varchar(255) ,在游标中再加控制,每5个记录 生成一个 sql 语句  
运行时 改变为 exec (@sqlstr1+@sqlstr2+@sqlstr3+@sqlstr4)的形式 

(原来 mssql 7.0 没有varchar(8000) 我就是这样做的 )

 zhangyh123 回复于:2003-06-28 20:10:44 怎么没有人回? 有人成功改造过吗? 

   我下周改造。到时候再贴

 jazy 回复于:2003-06-29 12:15:42 支持先!

 遥望 回复于:2003-09-01 17:49:24 在UNIX下怎么使用SYBASE 呀??

我安装好SYBASE后,不知道怎么用,请指教.
QQ:121824500

希望可以QQ交流,谢谢

全力支持你 

 zhangyh123 回复于:2003-09-01 18:35:51 如果你从来没有接触过建议你先啃一两本书再来详细交流,如果在看书时
有什么问题,可以在这里问。
搞清楚 sybase ase 软件的目录结构,每个目录的内容  有哪些工具 ,都是做什么的 
什么是设备、什么是段  sql 基本语句 函数 
系统表有哪些,主要的几个 : sysobjects \sysdevices \syssegments 
syscolumns 等 
很多基本概念必须先清楚,否则问什么别人也不知道

 stroustrup 回复于:2003-09-03 15:05:17 作过。不过没有这么灵活。

 

打印本文 打印本文 关闭窗口 关闭窗口