引言
相信大家都曾经或多或少的遇到过类似这样的问题:
1、在一个报表中,统计年度、月度值,但是我只会写简单的T-SQL;
2、在一个报表中同时显示两个数据库或两个数据库实例中的数据,或者不同数据源下的两份数据。没办法在查询层面关联。
我们通常会尽可能在在数据层面聚合这些数据,但是当条件不足或者是不具备这样的SQL能力时该怎么办?
关键知识点
函数lookup:使用 Lookup 可以从指定的数据集中为具有一对一关系的名称-值对检索对应的值。例如,对于表中的 ID 字段,可以使用 Lookup 从未与数据区域绑定的数据集中检索对应的“名称”字段。示例:lookup(本数据集关键字段,目标数据集关键字段,目标数据集显示字段,"目标数据集名称"),返回目标数据集显示字段。
函数lookupset:使用 LookupSet 可以从指定的数据集中为具有一对多关系的名称-值对检索一组值。例如,对于表中的客户标识符,可以使用 LookupSet 从未与数据区域绑定的数据集中检索该客户的所有关联电话号码。lookup(本数据集关键字段,目标数据集关键字段,目标数据集显示字段,"目标数据集名称")。示例:用法同lookup,不同之处在于它返回一组结果,近似于数组。
函数Join:返回通过联接数组中包含的多个子字符串而创建的字符串。示例:Join(结果集,"分隔符"),类似于我们C#中的string.join。
Lookup案例
step1、构造两个数据集
with tmp
as --尺寸数据集
(
select '2014/11/1' as tdate, 1234 as c20, 2234 as c40, 3234 as c45
union all
select '2014/11/2', 2234, 3234, 4234
)
select * from tmp
;
with tmp
as --次数数据集
(
select '2014/11/1' as tdate, 111 as ttime
union all
select '2014/11/2', 222
)
select * from tmp
;
step2、报表中添加数据源、数据集
step3、插入表格、添加DS_SIZE数据
因为DS_SIZE字段要多,当然也可以先添加DS_TIME数据集。区别在于这个表格的DataSetName是那个数据集,相当于默认数据集是那个。
setp4、使用lookup函数获取次数,这儿是重点
=Lookup(Fields!tdate.Value,Fields!tdate.Value,Fields!ttime.Value, "DS_TIME")
setp5、预览效果如下
LookupSet案例
lookupset和lookup其实很像,就是返回结果不同。我们仍参考上面的例子,对数据集略作调整。
setp1、构造两个数据集
with tmp
as --尺寸数据集
(
select '2014/11/1' as tdate, 1234 as c20, 2234 as c40, 3234 as c45
union all
select '2014/11/2', 2234, 3234, 4234
)
select * from tmp
;
with tmp
as --姓名数据集
(
select '2014/11/1' as tdate, '张三' as tname
union all
select '2014/11/1', '李四'
union all
select '2014/11/2', '王五'
union all
select '2014/11/1', '陈六'
union all
select '2014/11/2', '周七'
union all
select '2014/11/2', '吴八'
)
select * from tmp
;
step2、报表中添加数据源、数据集
step3、插入表格、添加DS_SIZE数据
step4、使用lookupset函数获取同天多人姓名,这儿是重点
=Join(LookupSet(Fields!tdate.Value,Fields!tdate.Value,
Fields!tname.Value, "DS_NAME"),",")
setp5、预览效果如下
总结
当然,这儿的示例可能不那么恰如其分。本文主要是讲述下在SQL聚合能力不足,或者数据源原因无法在SQL层面聚合数据时,该如何将数据关联起来呈现。