mysql比较行实现

一. 背景:

最近接到报表相关的一些处理,特殊需求是在同一个结果集中将上下两行数据做对比。由于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行号的处理上。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值