在某些ERP报表系统中,数据的存储是按照账套存储的,每年一个账套,对应一个数据库,这样在查询报表时,Sql语句就需要动态的从相应的数据中查询数据。
也有需要在同一张样式的报表中,通过不同的条件,分别查看同一样式,不同聚合维度的数据等场景。
类似以上的场景,就需要根据参数条件,动态的执行对应的Sql语句。
场景一:根据选择不同年度,从不同账套(即数据库)查询数据
例如:有三年的账套,分别对应三个数据库,2017、2018、2019,三个数据库查询的表结构一样。
根据选择年份,从不同数据库查询数据。
1.创建报表:使用完整的sql语句创建数据集获取结构,验证数据。
2.添加报表参数:查询年度:cyear,可选数据手动添加3个年份;
3.重新编辑数据集:使用动态Sql,通过参数值来控制数据库的名称。
动态数据集查询语句:="select * from [" & Parameters!cyear.Value & "].dbo.sales_订单",之后点击确定。
可以将改语句放到文本框表达式中,验证语句输出结果,将结果复制到数据库管理工具执行,验证SQL正确性。
4.验证效果。
在参数中选择不同年份时,从不同的数据库查询sql。
选2017时,查询数据库【2017】中的sales_订单表数据。
选2018时,查询数据库【2018】中的sales_订单表数据。
场景二、不同的查询维度,执行不同的sql语句。
例如:查询周期参数值选择【天】时,查看每日明细;参数值为【月】时,查看每月汇总。
1.完整sql创建数据集获取结构,并绑定表格。
select 订购日期,运货费 from sales_订单
2.添加查询周期参数:每日、每月、每季度,并设置可选值。
3.修改数据集,改为动态参数。
此处,根据不同的参数值,执行不同的sql语句,有两种实现方法:
函数1.IIF函数
数据集写法:
=IIF(Parameters!cxzq.Value="每日","select convert(varchar(10),订购日期,112) 订购日期,运货费 from sales_订单",IIF(Parameters!cxzq.Value="每月","select convert(varchar(2),month(订购日期)) + '月' as 订购日期,sum(运货费) 运货费 from sales_订单 group by month(订购日期) order by month(订购日期) "," select datename(quarter,订购日期) + '季度' as 订购日期,sum(运货费) 运货费 from sales_订单 group by datename(quarter,订购日期) order by datename(quarter,订购日期)"))
函数2.Switch函数
数据集写法:
=Switch(Parameters!cxzq.Value="每日","select convert(varchar(10),订购日期,112) 订购日期,运货费 from sales_订单",Parameters!cxzq.Value="每月","select convert(varchar(2),month(订购日期)) + '月' as 订购日期,sum(运货费) 运货费 from sales_订单 group by month(订购日期) order by month(订购日期) ",Parameters!cxzq.Value="每季","select datename(quarter,订购日期) + '季度' as 订购日期,sum(运货费) 运货费 from sales_订单 group by datename(quarter,订购日期) order by datename(quarter,订购日期)")
函数的意思类似,就是分别根据不同的参数值,决定返回的sql语句。
4.预览效果:选择不同参数值,查看报表。
每日:
每月:
每季: