动态列报表
由于在项目中需要用到动态列,类似下图效果,其中列和行都是动态产生的.起初接到这个要求,觉得有点难度,但有问题了应该迎难而上,在仔细研究及细细摸索下,却发现也不会太难,现写下此博客,希望对有此需要的朋友起到一定的帮助.
2014-06-01 | 2014-06-02 | 2014-06-03 | 2014-06-04 | 2014-06-05 | 2014-06-06 | 2014-06-07 | 2014-06-08 | 2014-06-09 | ||||||||||
12:37 | 8.00 | 08:03 | 4.00 | 08:06 | 2.00 | 08:07 | 2.00 | 08:00 | 2.00 | 08:10 | 2.00 | 07:59 | 2.00 | 08:03 | 4.00 | 08:01 | 2.00 | |
12:38 | 5.00 | 12:32 | 8.00 | 12:36 | 8.00 | 12:32 | 8.00 | 12:37 | 8.00 | 08:11 | 3.80 | 12:33 | 5.00 | 08:10 | 10.30 | |||
12:48 | 7.00 | 12:31 | 8.00 | 12:43 | 7.00 | 12:35 | 5.00 | |||||||||||
日消费 | 8.00 | 9.00 | 10.00 | 10.00 | 10.00 | 17.00 | 13.80 | 16.00 | 17.30 |
由于以前做过水晶报表和SSRS报表,个人认为此种情况下还是SSRS报表做起来比较方便. 但想到提出要求的数据存储在SQL2000服务器上,这里又存在一个问题,就是如何给分组编一个行号. 但办法总比问题多.努力了总会有收获.现将代码帖下,当然,如果是SQL2005或以后的版本用 row_number() over (partition by xxx order by kkkk) 就方便多得多了.以下是该项目涉及到的SQL代码.
Create table #AllData ( RID int identity(1,1), CDate varchar(10) not null, ConsumeTime varchar(5) not null, CardNo varchar(10), Suser varchar(7), Name varchar(20), Dept varchar(40), ConsumeSum money, Balance money, ByWho varchar(10) ) insert into #AllData (CDate,ConsumeTime,CardNo,Suser,Name,Dept,ConsumeSum,Balance,ByWho) select convert(varchar(10),FEE.消费时间,121), convert(varchar(5),FEE.消费时间,108),FEE.卡号,FEE.工号,SUSER.姓名,SUSER.部门,FEE.消费金额,FEE.卡上余额,FEE.经手人 FROM 收费表 FEE with (nolock),发行表 SUSER with (nolock) WHERE FEE.卡号=SUSER.卡号 AND FEE.工号=SUSER.工号 AND (SUSER.工号 between @SUSER1 and @SUSER2 ) AND (FEE.消费时间 BETWEEN @dt1 AND @dt2) AND FEE.消费金额<>0 ORDER BY SUSER.部门,SUSER.工号,FEE.消费时间 -- 以下这里是sql2000实现分组行号的办法,请记住 -- select (select count(*) from #AllData as b where a.CDate=b.CDate and a.RID>=b.RID) AS GRID, a.* from #AllData as a
然后就是在SSRS中设计此报表,SSRS其实还有很多高级功能可以丰富报表,体高用户体验. 在这里就不在赘述,现帖出设计图案.以下箭头所指地方需要多多留意.
只要按这种形式设计相应字段栏位即可. 这里设置单笔超过10块,日消费超过12块则改变数字显示颜色.下图是效果图.
然后可以设计订阅此报表,每天定时运行发送到相应的人的邮箱中去.
配置图,以及发到邮箱结果.