SQL报表(Report Builder)里面的几个常见问题(持续更新)
一
SQL报表常常会遇到在表格中的相除,如果分母为零,一般会显示错误号,我们可以这么处理:(加上是A/B)
=A / iif(B=0,99999999999999, B)
但是我们不能这么写:
=iif(B=0,0,A/B) //我们不能这么写,会产生BUG,至于什么BUG,你们可以自己试试
二
我们假设报表中的某一个格子的名字为A,我们在A中需要引用另一个格子B的值,在这种情况下,我们通常会把B中的计算公式再次引用在A中复制一遍,这样很导致很麻烦。
我们可以在A中直接这么写:
ReportItems!B表的名字.Value
这样就不需要再一次得把公式写一遍了
三
在报表曲线图中的横坐标,倘若我们需要动态得变化横坐标,我们这时候一般会把轴选项设置为自动,但是这样往往得不到我们想要的结果,下面的例子就是根据参数(开始时间和结束时间)的间隔动态地改变横坐标的样式
水平轴属性》数字》自定义
=IIf(Parameters!startime.Value=Parameters!endtime.Value,"",iif(DateAdd(DateInterval.day,-4,Parameters!endtime.Value)>=Parameters!startime.Value,"MM/dd","M/d H:mm"))
四
如果在表内求和,而不要GROUP,一般用在有很多求和的报表里面,这个时候只要用这种方法求出一列,然后在report builder里面直接填写first(列)即可(不能SUM),代码如下:
SUM(Periodic ) OVER (partition by A) as AAA, --表示对列Periodic 求和(等同于GROUP A,但是会在A的每一项后面显示) SUM(Periodic ) OVER (partition by A,B) as BBB, --表示对列Periodic 求和(等同于GROUP A,B,但是会在A,B的每一项后面显示) SUM(Periodic ) OVER (partition by 1) as CCC --对总的Periodic求和,这一列的数字都是一样的
五
想要把存储过程的输出内容赋值到参数上面(这个是copy的)
create procedure ProTest ( @name varchar(10), @money int output ) as begin if(@name='1') set @money=1000 else set @money=2000 end
假设是上面的存储过程:ProTest,这个存储过程返回的是@money 这个参数的值,那么当我们在另外一个存储过程中调用此存储过程的时候如何获取这个参数呢,方法如下:
declare @m int ---用来接收返回值的变量 exec ProTest @name='1',@money=@m output -- 一定要注名是output