将部份报表从Oracle迁到MySQL中时, 发现要在MySQL中实现Oracle的分析函数功能, 解决诸如”每个员工在各自部门中按工资降序排列的名次”等问题, 在Oracle中我们以用”rank() over (partition by deptno order by sal desc)”这样的语句来实现, 可这个在MySQL中怎么实现? SQL实在难写.

    这样的需求还是有一定的通用性的, 不如放到客户端来计算, 在DataReport中实现它吧! 下面这个报表的后台数据库是在MySQL上的, 先猜猜是如何完成的.


empno ename job sal deptno Pecent Rank
7782 CLARK MANAGER 2450.0 10 28 2
7839 KING PRESSIDEN 5000.0 57.1429 1
7934 MILLER CLERK 1300.0 14.8571 3
7369 SSMITH CLERK 800.0 20 7.3563 5
7566 JONESS MANAGER 2975.0 27.3563 3
7788 SSCOTT ANALYSST 3000.0 27.5862 1
7876 ADAMSS CLERK 1100.0 10.1149 4
7902 FORD ANALYSST 3000.0 27.5862 2
7499 ALLEN SSALESSMA 1600.0 30 17.0213 2
7521 WARD SSALESSMA 1250.0 13.2979 5
7654 MARTIN SSALESSMA 1250.0 13.2979 4
7698 BLAKE MANAGER 2850.0 30.3191 1
7844 TURNER SSALESSMA 1500.0 15.9574 3
7900 JAMESS CLERK 950.0 10.1064 6

    所用的SQL只是非常简单的SELECT语句.

select
        empno, ename, job, sal, deptno
    from emp_his order by deptno

    在报表定义文件中, 定义了两个虚拟列, 指定表达式, 就完成这个工作了.

webchart.express_1=Pecent|100*x/y|sal,sum::sal|deptno
    Rank|x|rnk::sal|deptno
webchart.merge_1=deptno

    这样在不同的数据库之间迁移起来就简单多了, DataReport中已经实现了”min, max, sum, avg, cnt, row, rnk”这七个计算公式. 虽然功能很好, 但实现的逻辑并没有优化, 处理大量数据估计不行, 但一个页面上的少量数据, 应当没有什么问题.