case when 将表中一列按照一定规则分两列显示

时间:2021-05-20 10:31:49

引言

自从做android开发后就很少接触sql代码的编写,前段时间一朋友问我一到sql面试题,咋眼一看这不是挺简单的嘛对两列做GROUP BY不就可以了,

select id , dates,count(1) from data GROUP BY dates,result

case when 将表中一列按照一定规则分两列显示

写了之后才发现并不是想要的结果。瞬间自信心。。。。。灰溜溜的告诉他我不会(当时不会)。因为那段时间工作太忙就把这件事放到脑后了。正好五一假期没事做就无意间又发现了那道题。依我的性格不搞定这道题怎么能行。

问题

根据下图表中数据写出sql,结果如图所示。。

case when 将表中一列按照一定规则分两列显示

具体实现

创建表

DROP TABLE IF EXISTS `data`;
CREATE TABLE `data` ( `dates` varchar(255) CHARACTER SET utf8 DEFAULT NULL, `id` int(11) DEFAULT NULL, `result` varchar(255) CHARACTER SET utf8 DEFAULT NULL );
INSERT INTO `data` (`dates`, `id`, `result`) VALUES ('2015109101', 1, '胜');
INSERT INTO `data` (`dates`, `id`, `result`) VALUES ('2015110101', 2, '负');
INSERT INTO `data` (`dates`, `id`, `result`) VALUES ('2015109101', 3, '负');
INSERT INTO `data` (`dates`, `id`, `result`) VALUES ('2015109101', 4, '胜');
INSERT INTO `data` (`dates`, `id`, `result`) VALUES ('2015110101', 5, '胜');
INSERT INTO `data` (`dates`, `id`, `result`) VALUES ('2015109101', 6, '负');
INSERT INTO `data` (`dates`, `id`, `result`) VALUES ('2015109101', 7, '胜');
INSERT INTO `data` (`dates`, `id`, `result`) VALUES ('2015110101', 8, '负');

最开始我是这么想的按照日期分组,用子查询分别统计result的“胜”和“负”,于是就有了一下错误代码。。。

select id , dates, (select count(result) from data where result="胜") as "胜", (select count(result) from data where result="负") as "负" from data GROUP BY dates

结果并不是我想象的那样。。
case when 将表中一列按照一定规则分两列显示
第一次尝试失败。。。。。

第二次换一种思路用子查询不行就使用case when 于是就有了

select id, dates, case when result like'胜' then count(result) end as '胜', case when result like'负' then count(result) end as '负' from data GROUP BY dates;

结果又一次失败(case函数只返回第一个符合条件的值,剩下的case部分将会被自动忽略。
case when 将表中一列按照一定规则分两列显示

但是不觉得这次结果已经很接近了吗。仔细观察上面sql突然发现了一点咱case when … then 之后我只是用count(函数)把result进行了处理其实在then 之后可以这么处理then 1else 0 end 然后对case when 的结果进行sum().不就可以了嘛。说着就来

SELECT id,dates, SUM( CASE WHEN result = '胜' THEN 1 ELSE 0 END) as "胜", SUM( CASE WHEN result = '负' THEN 1 ELSE 0 END) as "负" FROM `data` GROUP BY dates;

这次结果与所想完全一致。
case when 将表中一列按照一定规则分两列显示

写在最后

当然或许还有其他的实现方法。如有更好的方法还请不吝赐教,谢谢!