我们想实现的效果图如下:
即在报表中能够显示出序号。
这时我们就需要在报表的数据源中通过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;
本文的介绍就到此结束了。