免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 2783 | 回复: 5
打印 上一主题 下一主题

关于在 sybase 下生成交叉报表的方法,希望能够抛砖引玉 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2003-06-27 17:55 |只看该作者 |倒序浏览
有时候在开发产品时,要为用户提供输出比较多的报表,当用户处软件配置、初始化数据设置不一致时,报表的格式可能就不一样,这样,竖表变横表(既交叉报表)就能够发挥强大的作用


--假设有一个表 归类项目表,有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) 我就是这样做的 )

论坛徽章:
0
2 [报告]
发表于 2003-06-28 20:10 |只看该作者

关于在 sybase 下生成交叉报表的方法,希望能够抛砖引玉

怎么没有人回? 有人成功改造过吗?

   我下周改造。到时候再贴

论坛徽章:
0
3 [报告]
发表于 2003-06-29 12:15 |只看该作者

关于在 sybase 下生成交叉报表的方法,希望能够抛砖引玉

支持先!
遥望 该用户已被删除
4 [报告]
发表于 2003-09-01 17:49 |只看该作者
提示: 作者被禁止或删除 内容自动屏蔽

论坛徽章:
0
5 [报告]
发表于 2003-09-01 18:35 |只看该作者

关于在 sybase 下生成交叉报表的方法,希望能够抛砖引玉

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

论坛徽章:
0
6 [报告]
发表于 2003-09-03 15:05 |只看该作者

关于在 sybase 下生成交叉报表的方法,希望能够抛砖引玉

作过。不过没有这么灵活。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP