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

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

empnoenamejobsaldeptnoPecentRank
7782CLARKMANAGER2450.010282
7839KINGPRESSIDEN5000.057.14291
7934MILLERCLERK1300.014.85713
7369SSMITHCLERK800.0207.35635
7566JONESSMANAGER2975.027.35633
7788SSCOTTANALYSST3000.027.58621
7876ADAMSSCLERK1100.010.11494
7902FORDANALYSST3000.027.58622
7499ALLENSSALESSMA1600.03017.02132
7521WARDSSALESSMA1250.013.29795
7654MARTINSSALESSMA1250.013.29794
7698BLAKEMANAGER2850.030.31911
7844TURNERSSALESSMA1500.015.95743
7900JAMESSCLERK950.010.10646

    所用的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"这七个计算公式. 虽然功能很好, 但实现的逻辑并没有优化, 处理大量数据估计不行, 但一个页面上的少量数据, 应当没有什么问题.