【mysql】实现行列转置

背景

记得很早之前做过一家公司的sql笔试题,其中有一道题大致是这样,给一个表,让统计各个家具当月的销售总数量,然后显示成下图的形式。当时对mysql还了解不深我看到该题时心想是不是出题之人把行列搞错了,最后还是坚持自己的想法横向显示了。事后一查才发现自己见识如此之少,一阵惭愧,当然这都是后话了。虽然这次的总结很简单,但确是初学者不容易想到的点,即便自己对这块已经很熟悉了,但还是要警示自己,学无止境,要吸取教训,不断学习。下面以用户登录终端为例来开启我们今天的分享吧~


image.png
技术与实现
  • 目标
    输出5月份各终端用户登录次数,展示结果如下图:


    image.png
  • 表结构

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
  • 结果


    image.png

你可能感兴趣的:(【mysql】实现行列转置)