如何给报表添加序号

2020-12-08 10:47

137 1 2

我们想实现的效果图如下:

即在报表中能够显示出序号。

这时我们就需要在报表的数据源中通过mysql用@a:=@a+1来实现,如下图所示:

#db.query("select d.desc1 as status1,c.* from (select *,(@a:=@a+1) AS serial from (select * from fc_bidding_project_detail where bidding_status='05' and jjxm_code=?) a,(select @a:=0) b order by a.actual_end_time) c left join sys_dic_detail_info d on c.type=d.detailno and d.diccode='ZCZL006'",code)

 

以上是举了个例子来说明序号的使用,实际上这是用到了row_number()函数,即排名函数,接下来我们将

 

具体来介绍row_number()函数的用法。

 

row_number()函数简介

 

row_number()函数是一个排名函数,它返回一行的序号,从第一行的1开始。我们经常使用

 

row_number()函数来生成待定报告。

 

用法1:为每一行添加一个行号

 

要模拟row_number()函数,我们必须在查询中使用会话变量,即由@前缀指示的变量,如

 

@row_number

 

例子:

 

以下语句从employees表中获取5名员工,并从1开始为每行添加行号。

 

SET @row_number = 0;

SELECT

              ( @row_number : = @row_number + 1 ) AS num,

              firstName,

              lastName

FROM

             employees

             LIMIT 5;

 

挑选出来的数据如下:

 

在上面的陈述中:

 

☆在第一个语句中,我们定义了一个名为row_number的变量,并将其值设置为0,这row_number是由@前缀指示的

 

会话变量。

 

☆在第二个语句中,我们从employees表中选择数据,并将每行的row_number变量值增加到1。LIMIT子句用于约束

 

返回的行数,在这种情况下,它被设置成5。

 

另一种技术是使用会话变量作为派生表,并将其与主表交叉连接。请参阅以下查询:

 

SELECT

           ( @row_number : =@row_number + 1 ) AS num,firstName,lastName

FROM

           employees,(SELECT @row_number :=0 ) AS t

LIMIT 5;

 

请注意,派生表必须具有自己的别名,以使查询在语法上正确。

 

 

用法2:为每个组添加行号

 

如果我们要为每个组添加行号,并为每个新组重置行,怎么做?

 

我们用payments表来示例:

 

SELECT

           customerNumber, paymentDate, amount

FROM

          payments

ORDER BY customerNumber;

 

挑选出来的数据如下:

 

假设我们要为每个客户添加一个行号,并在客户编号更改时重置行号。

 

要实现此目的,我们必须使用两个会话变量,一个用于行号,另一个用于存储旧客户编号,以将其与当前客户编号进行

 

比较,如下面的查询:

 

SELECT

           @row_number :=

           IF( @customer_no = customerNumber, @row_number +1, 1 )  AS num,

           @customer_no : = customerNumber AS CustomerNumber,

           paymentDate,

           amount

FROM

           payments

ORDER BY

           customerNumber;

 

我们在查询中使用了IF函数。如果客户编号保持不变,我们增加了 row_number 变量,否则,我们将其重置为1。

 

查询结果如下面的截图所示:

 

与 row_number 每行一样,我们可以使用派生表和交叉连接技术来生成相同的结果。

 

SELECT

           @row_number := CASE

                  WHEN @customer_no = customerNumber THEN @row_number + 1

                  ELSE 1

           END AS num,

           @customer_no := customerNumber as CustomerNumber,

           paymentDate,

           amount

FROM

           payments,(SELECT @customer_no :=0,@row_number :=0) as t

ORDER BY customerNumber;

 

本文的介绍就到此结束了。

还可以输入500个字
表情
Ctrl+Enter
全部评论(0)
最新/最热

寄意

福建省 | 厦门市

关注
私信
最新资讯
写私信×
寄意
还可以输入500个字