1. 程式人生 > >帆軟報表(finereport)使用row_number ()進行組內排序

帆軟報表(finereport)使用row_number ()進行組內排序

課程表 decimal () port 分享 values 順序 repo info

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分區

查詢結果:

技術分享圖片

報表展示結果:

技術分享圖片

帆軟報表(finereport)使用row_number ()進行組內排序