表名是datedemo,date1列是日期date类型,result列是varchar类型
现在想达到这样的效果,如下图:
此环境是mysql环境,oracle的一些高阶函数,也用不上。
首先笔者想到的是group_concat搭配substring_index,但是转念一想,group_concat+substring_index+group经常是用作分组取topN的,类似于oracle的row_number() over(partition by XX order by ZZ asc/desc),用在这里显然不太合适,这里的场景是类似于行转列再求和的场景。
于是乎,case when 搭配sum的技巧就来了。
SELECT
date1,
sum(
CASE
WHEN result = "win" THEN
1
ELSE
0
END
) win,
sum(
CASE
WHEN result = "lose" THEN
1
ELSE
0
END
) lose
FROM
datedemo
GROUP BY
date1
当然这里是求和,我的标题是(mysql中使用case when搭配聚合函数做到行转列),我用的是聚合函数,也就是说,分情况来对待,求和就用casewhen+sum,不做操作只是聚合casewhen+max或者min都可以。
下面是数据:
/*
Navicat MySQL Data Transfer
Source Server : localhost
Source Server Version : 50549
Source Host : localhost:3306
Source Database : ws
Target Server Type : MYSQL
Target Server Version : 50549
File Encoding : 65001
Date: 2019-08-18 21:42:42
*/
SET FOREIGN_KEY_CHECKS=0;
-- ----------------------------
-- Table structure for datedemo
-- ----------------------------
DROP TABLE IF EXISTS `datedemo`;
CREATE TABLE `datedemo` (
`date1` date DEFAULT NULL,
`result` varchar(255) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
-- ----------------------------
-- Records of datedemo
-- ----------------------------
INSERT INTO `datedemo` VALUES ('2005-05-09', 'lose');
INSERT INTO `datedemo` VALUES ('2005-05-09', 'lose');
INSERT INTO `datedemo` VALUES ('2005-05-09', 'win');
INSERT INTO `datedemo` VALUES ('2005-05-10', 'win');
INSERT INTO `datedemo` VALUES ('2005-05-10', 'lose');
INSERT INTO `datedemo` VALUES ('2005-05-10', 'lose');
INSERT INTO `datedemo` VALUES ('2005-05-09', 'win');