日期:2014-05-19  浏览次数:20649 次

用sql 可以生成动态报表吗?
搜索一下动态报表,大部分都是用编程语言实现的,我试想,可不可以用sql   语句完成呢?

目的是想不用写代码生成类似的报表,尤其是财务报表

表如下

T1:
key_seq project_name
1             '实发工资 '
2             '扣款项 '

T2:
key_seq detail_name link_key colname
1             '基本工资 ' 1 'col2 '
2             '奖金 ' 1 'col1 '
3             '扣考勤 ' 2 'col3 '
4             '扣税 ' 2 'col5 '


T3:
key_seq employee col1 col2 col3 col4 col5
1             'a ' 100 50 10 0 20
2             'b ' 100 30 20 0 20
3             'c ' 100 20 10 0 20


想得到这样的结果:(注意,我是想要把T1,T2中的project_name,detail_name拿过来做字段名的,还有就是请不要拘泥于测试数据,
希望各位能够做的比较灵活
)
-------实发工资------ ----------扣款项-----
员工 基本工资 ' 奖金                         扣考勤 扣税
'a ' 50 100                   10           20
'b ' 30 100                   20           20
'c ' 20 100                   10           20

------解决方案--------------------
create table T1(key_seq int,project_name varchar(10))
insert into T1 select 1, '实发工资 '
insert into T1 select 2, '扣款项 '

create table T2(key_seq int,detail_name varchar(10),link_key int,colname varchar(10))
insert into T2 select 1, '基本工资 ',1, 'col2 '
insert into T2 select 2, '奖金 ' ,1, 'col1 '
insert into T2 select 3, '扣考勤 ' ,2, 'col3 '
insert into T2 select 4, '扣税 ' ,2, 'col5 '


create table T3(key_seq int,employee varchar(4),col1 int,col2 int,col3 int,col4 int,col5 int)
insert into T3 select 1, 'a ',100,50,10,0,20
insert into T3 select 2, 'b ',100,30,20,0,20
insert into T3 select 3, 'c ',100,20,10,0,20
go

declare @sql varchar(8000)
set @sql= ' '

select @sql=@sql+ ',[ '+a.project_name+ '-- '+b.detail_name+ ']= '+b.colname
from T1 a,T2 b where a.key_seq=b.link_key

set @sql= 'select employee '+@sql+ ' from T3 '

exec(@sql)
/*
employee 实发工资--基本工资 实发工资--奖金 扣款项--扣考勤 扣款项--扣税
-------- ----------- ----------- ----------- -----------
a 50 100 10 20
b 30 100 20 20
c 20 100 10 20
*/
go

drop table T1,T2,T3
go
------解决方案--------------------
SQL Server 2000不支持双表头,在我给出的例子里我把双表头合并了一下。
建议在应用程序中实现双表头的现实。
------解决方案--------------------
--创建测试环境
create table T1(key_seq int,project_name varchar(20))
create table T2(key_seq int,detail_name varchar(20),link_key int,colname varchar(20))
create table T3(key_seq int,employee varchar(10),col1 int,col2 int,col3 int,col4 int,col5 int)

--插入测试数据
insert T1(key_seq,