帆软报表(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分区

   查询结果:

报表展示结果:

原文地址:https://www.cnblogs.com/Williamls/p/10748752.html