一. 背景:
最近接到报表相关的一些处理,特殊需求是在同一个结果集中将上下两行数据做对比。由于MySQL中又没有获取行号的函数,所以想到了通过定义自定义变量@rownum来处理。
二. 方式:
可以自定义变量@rownum来初始化指定行号。
之后通过赋值语句@rownum:=@rownum + 1 来累加达到递增行号的需求
接着分别建立两张临时表,即可通过行号,进行比对。
注意:@rownum 是自定义变量而不是Mysql的函数,所以名字是可以随便取的比如@arownum@行号@rownumb
三. 代码示例:
1. 代码:
SELECT
'行比较' 分类,
a.'01月' '一月当前值',
b.'01月' '一月上一条',
CONCAT((ROUND(((a.'01月' - b.'01月') / a.'01月') * 100 ,2)),'%') '01月',
CONCAT((ROUND(((a.'02月' - b.'02月') / a.'02月') * 100 ,2)),'%') '02月'
FROM
(SELECT @arownum:=@arownum+1 rownum,an.* FROM (
SELECT
'行比较' 分类,
SUM(CASE WHEN trade_month = '01' THEN trade_amount ELSE 0 END) AS '01月',
SUM(CASE WHEN trade_month = '02' THEN trade_amount ELSE 0 END) AS '02月'
FROM
shop_items_monitor
GROUP BY trade_year,category
order by trade_year
) an,(SELECT @arownum:=0) t ORDER BY '年份' DESC) a,
(SELECT @brownum:=@brownum+1 rownum,an.* FROM (
SELECT
'行比较' 项目分类,
SUM(CASE WHEN trade_month = '01' THEN trade_amount ELSE 0 END) AS '01月',
SUM(CASE WHEN trade_month = '02' THEN trade_amount ELSE 0 END) AS '02月'
FROM
shop_items_monitor
GROUP BY trade_year,category
order by trade_year
)an ,(SELECT @brownum:=1) t ORDER BY '年份' DESC) b
WHERE a.rownum = b.rownum
这里就是如方式中,所说将结果集分成两个临时表,利用行号差进行对比。
注意到里面有 ( SELECT @arownum := 0 初始化行号为0) t 这相当于创建了别名为:t的新表。
这里注意 ( SELECT @arownum := 0 ) t* 必须加括号且取表别名 否则会报错
通过利用变量将@arownum的行进行重新赋值,并显示。可以应用于获取行号或名次排列。
2. 结果:
四. 后语:
mysql的行比较,其中的重点还是在于rownum行号的处理上。