交叉报表的实现
客户希望实现展现每个人最新的5个合同,如果数量不足则空白显示,报表样式为,
需求实现
第一步,利用RANK()函数从数据库取出对应的数据,sql为,
select * from (
SELECT a.人名,
a.合同编号,
a.合同起始时间,
a.合同截止时间,
RANK() OVER(PARTITION BY 人名 ORDER BY 合同编号) Rank
FROM table a
)tt
where tt.Rank<=5
第二步,设计报表如下,
预览即是需求中的效果。
附Rank说明:
Rank的基本语法为:
RANK ( ) OVER ( [query_partition_clause] order_by_clause )
例子:
有表Table内容如下
COL1 COL2
1 1
2 1
3 2
3 1
4 1
4 2
5 2
5 2
6 2
分析功能:列出Col2分组后根据Col1排序,并生成数字列。比较实用于在成绩表中查出各科前几名的信息。
SELECT a.*,RANK() OVER(PARTITION BY col2 ORDER BY col1) “Rank” FROM table a;
结果如下:
COL1 COL2 Rank
1 1 1
2 1 2
3 1 3
4 1 4
3 2 1
4 2 2
5 2 3
5 2 3
6 2 5