分组查询+列转行的一次MySQL实践

现有一张日志表,需要查询表中调用接口结果统计,表与本文相关的两个字段是接口名称以及调用结果。

表的相关数据如下图

*注:code为10000代表成功,其余均是失败

最终所查询的结果如下图:

记录一下整个思路:

第一步是根据接口名称以及code码分组查询,代码如下

SELECT
	interface_name type,
	code,
	count( 0 ) count 
FROM `upload_logs` 
GROUP BY
	interface_name,
    code 

然后就得到了如下结果:

第二步是需要将成功与失败的区分,这里失败的还需要用到sum来进行求和,还有就是要将成功与失败的作为列来展示,这一点比较关键,用到行专列的相关知识点,相关的在网上都能查的到,我就不赘述了,代码实现如下:

		SELECT
			type,
			sum(IF( code != '10000', count, 0 )) error,
			sum(IF( code = '10000', count, 0 )) success 
		FROM
			(
			SELECT
				interface_name type,
				code,
				count( 0 ) count 
			FROM
				`upload_logs`
            GROUP BY
				interface_name,
				code 
			) a 
		GROUP BY
			type 

其实就是将第一步的查询结果做进一步处理,后续都是这种思想。

第三步就是将成功率计算出来,这个就简单了,只不过需要在第二步的基础上,sql如下

	SELECT
		type,
		error,
		success
		,ROUND( IFNULL( success /( error + success ), 0 ), 4 ) rate 
	FROM
		(
		SELECT
			type,
			sum(IF( code != '10000', count, 0 )) error,
			sum(IF( code = '10000', count, 0 )) success
		FROM
			(
			SELECT
				interface_name type,
				code,
				count( 0 ) count 
			FROM
				`upload_logs` 
            GROUP BY
				interface_name,
				code 
			) a 
		GROUP BY
			type 
		) b 

最后就会得到开篇的结果

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值