zoukankan      html  css  js  c++  java
  • 帆软报表(finereport)使用row_number ()进行组内排序

    ROW_NUMBER()函数将针对SELECT语句返回的每一行,从1开始编号,赋予其连续的编号。在查询时应用了一个排序标准后,只有通过编号才能够保证其顺序是一致的,当使用ROW_NUMBER函数时,也需要专门一列用于预先排序以便于进行编号。

    ROW_NUMBER()

    说明:返回结果集分区内行的序列号,每个分区的第一行从1开始。
    语法:ROW_NUMBER () OVER  ([ <partition_by_clause> ] <order_by_clause>) 。
    备注:ORDER BY 子句可确定在特定分区中为行分配唯一 ROW_NUMBER 的顺序。
    参数:<partition_by_clause> :将 FROM 子句生成的结果集划入应用了 ROW_NUMBER 函数的分区。
          <order_by_clause>:确定将 ROW_NUMBER 值分配给分区中的行的顺序。
    返回类型:bigint 。

    ======================================================================

    此次实现的是Finereport中根据学生各科成绩进行各科成绩的排名

    准备数据:

    create table  grade    --班级表
    (
           gno           INT,           --编号
           gradeName     VARCHAR(100)   --班级名称
    )
    go
    insert into grade values(1901,'Z-19001'),
    (1902,'Z-19002'),
    (1903,'Z-19003')
    go
    
    create table  course   --课程表
    (
           cno               INT,--课程编号
           cname             VARCHAR(100), --课程名称
           tno               INT   --教师编号
    )
    go
    insert into course values(1,'微积分',804),
    (2,'计算机导论',801),
    (3,'计算机编程',802),
    (4,'python爬虫',803),
    (5,'HTML5',805)
    go
    create table  student   --学生表
    (
           sno               INT,  --学生编号
           sname             VARCHAR(100),--学生姓名
           ssex              VARCHAR(100),--学生性别
           sbirthday         VARCHAR(100),--学生生日
           gno               INT          --班级编号
    )
    go
    insert into student values(1001,'张三','男','1998-12-11',1901),
    (1002,'张山','男','1999-11-11',1901),
    (1003,'张三丰','男','1978-09-19',1901),
    (1004,'lily','女','1988-11-01',1902),
    (1005,'candy','女','1989-03-12',1902),
    (1006,'Tom','男','1992-05-28',1902),
    (1007,'Jack','男','1994-04-13',1903),
    (1008,'mark','男','1996-06-06',1903),
    (1009,'shary','女','1997-06-08',1903)
    go
    
    
    create table  score    --分数表
    (
           sno               INT,  --学生编号
           cno               INT,  --课程编号
           degree            decimal(10,2)  --分数
    )
    go
    insert into score values(1001,1,'92'),
    (1001,2,'95.5'),
    (1001,3,'89.5'),
    (1002,2,'92'),
    (1002,3,'65.5'),
    (1002,5,'92.2'),
    (1003,3,'88'),
    (1003,4,'66'),
    (1003,5,'76'),
    (1004,1,'93'),
    (1004,2,'96'),
    (1004,5,'78')
    go
    

      执行组内排序:

    SELECT s.sname,s.sno,g.gradeName,c.cname,o.degree,row_number() over(partition by cname order by degree desc) as 排名 
    FROM student s
    inner join dbo.grade g on s.gno=g.gno
    inner join dbo.score o on o.sno=s.sno
    inner join dbo.course c on c.cno=o.cno
    

      ※※   over(partition by cname order by degree desc) 按照degree排序进行累计,order by是个默认的开窗函数,按照cname分区

       查询结果:

    报表展示结果:

  • 相关阅读:
    nhibernate记事
    关于mysql数据库中,连续签到等连续日期的处理
    记IIS部署https arr urlrewrite
    mybatis Generator
    CGI
    FreedonStudio freertos 内存分配方式选择
    NB模块BC26调试记录
    调试升级程序记录
    最近做的一个嵌入式项目
    4*4键盘扫描程序--去抖加长按
  • 原文地址:https://www.cnblogs.com/Williamls/p/10748752.html
Copyright © 2011-2022 走看看