最近遇到一个问题:

year amount num
1991 1 1.1
1991 2 1.2
1991 3 1.3
1992 1 2.1
1992 2 2.2
1992 3 3.3

把上面表格的数据查询成:

year m1 m2 m3
1991 1.1 1.2 1.3
1992 2.1 2.2 2.3

看到这样的需求,首先想到的是用case去统计以及 用group by来分组

第一版sql代码:

SELECT
`year`,
(CASE WHEN amount = 1 THEN num END) AS n1,
(CASE WHEN amount = 2 THEN num END) AS n2,
(CASE WHEN amount = 3 THEN num END) AS n3
FROM
test
GROUP BY
`year`

查询出来的结果有点不如人意:

year n1 n2 n3
1991 1.1    
1992 2.1    

这么说明了分组之后只显示到第一行数据,那么我们去掉分组看看:

        SELECT
`year`,
(CASE WHEN amount = 1 THEN num END) AS n1,
(CASE WHEN amount = 2 THEN num END) AS n2,
(CASE WHEN amount = 3 THEN num END) AS n3
FROM
test
year n1 n2 n3
1991 1.1    
1991   1.2  
1991     1.3
1992 2.1    
1992   2.2  
1992     2.3

有点像我们想要的了,只是没有分组以及去掉空值

而且我们可以看出,在分组的情况下m1,m2,m3的值都是一个最大值来的

所以我们可以用一个子查询来查询上面的结果集中分组的最大值 最终版sql:

SELECT
`year`,
MAX(n1) AS m1,
MAX(n2) AS m2,
MAX(n3) AS m3
FROM
(
SELECT
`year`,
(CASE WHEN amount = 1 THEN num END) AS n1,
(CASE WHEN amount = 2 THEN num END) AS n2,
(CASE WHEN amount = 3 THEN num END) AS n3
FROM
test
) AS a
GROUP BY
`year`

最终可以得到我们想要的结果:

year m1 m2 m3
1991 1.1 1.2 1.3
1992 2.1 2.2 2.3

mysql中case的一个例子的更多相关文章

  1. MySQL中case when的基本用法总结

    MySQL中case when的基本用法总结原创Backcanhave7 最后发布于2018-12-06 15:14:15 阅读数 439 收藏展开MySQL中的case when有用两种用法,官方文 ...

  2. mysql中 case when的使用

    SELECT a.hsid, a.house_code, a.sale_date, a.pjid, COUNT( sdid ) AS num, b.hsid, b.pscid, b.hscode, b ...

  3. MySQL中CASE的使用

    语法说明: 方式一: CASE value WHEN [compare_value] THEN result [WHEN [compare_value] THEN result ...] [ELSE ...

  4. PHP与MYSQL中UTF8 中文排序例子

    1. 需要在php数组中用中文排序,但是一般使用utf8格式的文件,直接用asort排序不行.用gbk和gb2312可以.这跟几种格式的编码有关系.gbk和gb2312本身的编码就是用拼音排序的. 代 ...

  5. 记mysql中时间相关的一个奇怪问题

    发现mysql中类型为时间的字段,在查询时显示的时间是什么是依赖于客户端的,不同的客户端查同一个时间,可能在客户端显示的时间是不一样的.至于这个在哪里配置,以及服务端如何依据这个配置为客户端返回结果, ...

  6. MYSQL中case when then else end 用法

    条件语句 delimiter \\CREATE PROCEDURE proc_if ()BEGIN      declare i int default 0;   if i = 1 THEN      ...

  7. MySql 中 case when then else end 的用法

    解释: SELECT                case                   -------------如果    when sex='1' then '男' ---------- ...

  8. mysql中如何更新一个字段的值为它本身的值连接上一个字符串

    CONCAT(str1,str2,...)     返回结果为连接参数产生的字符串. 如有任何一个参数为NULL ,则返回值为 NULL. 或许有一个或多个参数. 如果所有参数均为非二进制字符串,则结 ...

  9. Mysql中where条件一个单引号引发的性能损耗

    日常写SQL中可能会有一些小细节忽略了导致整个sql的性能下降了好几倍甚至几十倍,几百倍.以下这个示例就是mysql语句中的一个单引号('')引发的性能耗损,我相信很多朋友都遇到过,甚至还在这样写. ...

随机推荐

  1. Asp.Net MVC +EntityFramework主从表新增编辑操作的实现(删除操作怎么实现?)

    Asp.Net MVC +EntityFramework主从表新增编辑操作的实现 对于MVC中同时对主从表的表单操作在网上现有的解决很少,而这样的操作在做业务系统中是经常为遇到的.我在网上搜索了很久都 ...

  2. xmldocument内嵌入另一个xmldocument,xmlnode的方法

    string xmlstr1 = @"<root><head>myHead</head><body></body></roo ...

  3. 微信支付的JAVA SDK存在漏洞,可导致商家服务器被入侵(绕过支付)XML外部实体注入防护

    XML外部实体注入 例: InputStream is = Test01.class.getClassLoader().getResourceAsStream("evil.xml" ...

  4. #13 让代码变得Pythonic

    前言 在学习Python的过程中,肯定听说过这么一个词:Pythonic,它的意思是让你的代码很Python! 一.列表生成式 前面有一节专门讲解了Python的列表,其灵活的使用方法一定让你陶醉其中 ...

  5. mybatis教程之原理剖析

    MyBatis是目前非常流行的ORM框架,功能很强大,然而其实现却比较简单.优雅.本文通过代理的方式来看下其实现 方式一:传统API方式 @Test public void add() throws ...

  6. Linux进程间通信(System V) --- 消息队列

    消息队列 IPC 原理 消息队列是消息的链式队列,如下图为消息队列的模型.整个消息队列有两种类型的数据结构. 1.msqid_ds 消息队列数据结构:描述整个消息队列的属性,主要包括整个消息队列的权限 ...

  7. oracle与mysql

    『创业团队最佳选择是Oracle+MongoDB,而不是MySQL』,当深蓝在QQ群里抛出这样的观点的时候,就像是在马蜂窝里丢了一串鞭炮一样热闹起来. 创业者甲: 开什么玩笑,Oracle要收钱的,太 ...

  8. Web前端基础——jQuery(二)

    一.jQuery 中的常用函数 1) $.map(Array,fn); 对数组中的每个元素,都用fn进行处理,fn将处理后的结果返回,最后得到一个数组 //因为这些操作,没有与dom元素相关的,所以可 ...

  9. javaSE总结

    1 java的历史 1991-至今  詹姆斯-高斯林  SUN公司 ORACLE 2009年 2 java的版本 javaSE  java的标准桌面级开发 javaEE  企业级web开发 javaM ...

  10. 安装 kubernetes v1.11.1

    kubernetes 版本 v1.11.1 系统版本:Centos 7.4 3.10.0-693.el7.x86_64 master: 192.168.0.205 node1: 192.168.0.2 ...