背景
记得很早之前做过一家公司的sql笔试题,其中有一道题大致是这样,给一个表,让统计各个家具当月的销售总数量,然后显示成下图的形式。当时对mysql还了解不深我看到该题时心想是不是出题之人把行列搞错了,最后还是坚持自己的想法横向显示了。事后一查才发现自己见识如此之少,一阵惭愧,当然这都是后话了。虽然这次的总结很简单,但确是初学者不容易想到的点,即便自己对这块已经很熟悉了,但还是要警示自己,学无止境,要吸取教训,不断学习。下面以用户登录终端为例来开启我们今天的分享吧~
技术与实现
-
目标
输出5月份各终端用户登录次数,展示结果如下图:
表结构
CREATE TABLE `user_login_log` (
`logid` int(10) unsigned NOT NULL AUTO_INCREMENT COMMENT '主键ID',
`userid` int(10) unsigned NOT NULL COMMENT '帐号ID,参考T6110.F01',
`login_time` datetime NOT NULL COMMENT '登录时间',
`login_ip` varchar(20) DEFAULT NULL COMMENT '登录IP',
`loginSource` enum('IOS','Android','H5','HYB','IOS_PRO','H5_WXFWH','PC') DEFAULT NULL COMMENT '登录来源',
`sourceVersion` varchar(1000) DEFAULT NULL COMMENT '来源版本',
`useVersion` varchar(20) DEFAULT NULL COMMENT '使用版本',
`logStatus` int(10) DEFAULT '0' COMMENT '日志状态(0:成功,1:失败)',
`deviceID` varchar(100) DEFAULT NULL COMMENT '设备ID',
PRIMARY KEY (`logid`),
KEY `user_login_uid` (`userid`) USING BTREE
) ENGINE=InnoDB AUTO_INCREMENT=11961594 DEFAULT CHARSET=utf8 COMMENT='用户登录日志';
- 实现
SELECT
sum(case when loginSource='PC' then c end) as 'PC',
sum(case when loginSource='H5' or loginSource='H5_WXFWH' then c end) as 'H5',
sum(case when loginSource='IOS' or loginSource='IOS_PRO' then c end) as 'IOS',
sum(case when loginSource='Android' then c end) as'Android'
from (
SELECT loginSource,COUNT(1)c from user_login_log
where loginSource is not null
and DATE_FORMAT(login_time,'%Y-%m')='2018-05'
GROUP BY loginSource
) temp1
-
结果