<%@ page contentType="text/html; charset=gb2312"%> 关于在 sybase 下生成交叉报表的方法
网站公告:   ◆北天JAVA技术网热情为java爱好者服务,本网内容包括JAVA(JSP、servlet、EJB、webservice、j2ee、javabean、应用服务器、JavaScript),数据库(MYSQL、SQL Server、Sybase、Oracle、DB2、数据库综合知识),设计研究(设计模式、Struts、Spring、Hibernate、设计框架、设计综合知识),WEB2.0新技术(主要介绍AJAX),以及各种技术的入门、实例、例子等等,欢迎各位多来坐坐!◆  诚邀各位JAVA爱好者加盟!◆  本网站内容丰富,更新快,保证每周20篇以上!  
加入收藏
设为首页
联系站长
承接项目
  相关资源:网站首页 | 免费培训学院 | 技术论坛 | JAVA聊天室 | 作家专栏 | 开发工具 | 认证考试 | 会员俱乐部
  JAVA技术初学者园地 | jsp与servlet | javascript | Java源代码 | EJB | web service | 应用服务器 | JAVA综合知识
  设计研究设计模式 | 设计框架 | Struts | Spring | Hibernate | 开源项目 | 面向对象设计 | 设计综合知识
  数 据 库MYSQL | SQL Server | Sybase | Oracle | DB2 | Informix | Access | 数据库综合知识
  其他资源:AJAX新技术 | 网站开发 | ERP软件 | OA办公软件 | 商业智能BI | 开发综合知识 | 承接项目 | 项目试用

 
 
关于在 sybase 下生成交叉报表的方法
     发布者: 发布时间:2006-07-10
有时候在开发产品时,要为用户提供输出比较多的报表,当用户处软件配置、初始化数据设置不一致时,报表的格式可能就不一样,这样,竖表变横表(既交叉报表)就能够发挥强大的作用


--假设有一个表 归类项目表,有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,8) 
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(8) 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(8), --开始日期 
@date_e char(8) --截止日期 
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) 我就是这样做的 )

(转载文章请保留出处:北天JAVA技术网(www.java114.com))
 
更多精彩文章:
送个sybase数据导出导入脚本给各位
Sybase for linux安装步骤
sybase整库复制步骤
解决Sybase数据库死锁
sql server中SQL查询语句精华使用简要
Sql server中时间查询的一个比较快的语句
 
        
标 题:   
内 容:   
 
                                  
 
免责声明:该文章由网友发表,如果对您造成侵权,请联系站长

首页 - 承接项目 - 网站地图 - 联系我们 -
版权所有北天JAVA技术工作室 ICP证号:粤ICP备06079815号