mysql中case的一个例子
最近遇到一个问题:
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的一个例子的更多相关文章
- MySQL中case when的基本用法总结
MySQL中case when的基本用法总结原创Backcanhave7 最后发布于2018-12-06 15:14:15 阅读数 439 收藏展开MySQL中的case when有用两种用法,官方文 ...
- 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 ...
- MySQL中CASE的使用
语法说明: 方式一: CASE value WHEN [compare_value] THEN result [WHEN [compare_value] THEN result ...] [ELSE ...
- PHP与MYSQL中UTF8 中文排序例子
1. 需要在php数组中用中文排序,但是一般使用utf8格式的文件,直接用asort排序不行.用gbk和gb2312可以.这跟几种格式的编码有关系.gbk和gb2312本身的编码就是用拼音排序的. 代 ...
- 记mysql中时间相关的一个奇怪问题
发现mysql中类型为时间的字段,在查询时显示的时间是什么是依赖于客户端的,不同的客户端查同一个时间,可能在客户端显示的时间是不一样的.至于这个在哪里配置,以及服务端如何依据这个配置为客户端返回结果, ...
- MYSQL中case when then else end 用法
条件语句 delimiter \\CREATE PROCEDURE proc_if ()BEGIN declare i int default 0; if i = 1 THEN ...
- MySql 中 case when then else end 的用法
解释: SELECT case -------------如果 when sex='1' then '男' ---------- ...
- mysql中如何更新一个字段的值为它本身的值连接上一个字符串
CONCAT(str1,str2,...) 返回结果为连接参数产生的字符串. 如有任何一个参数为NULL ,则返回值为 NULL. 或许有一个或多个参数. 如果所有参数均为非二进制字符串,则结 ...
- Mysql中where条件一个单引号引发的性能损耗
日常写SQL中可能会有一些小细节忽略了导致整个sql的性能下降了好几倍甚至几十倍,几百倍.以下这个示例就是mysql语句中的一个单引号('')引发的性能耗损,我相信很多朋友都遇到过,甚至还在这样写. ...
随机推荐
- (转)关于CNN中平移不变性的理解
https://www.quora.com/Why-and-how-are-convolutional-neural-networks-translation-invariant https://st ...
- docker化java web应用
一.简介 Docker是一个使用Go语言开发的开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的机器上.Docker的发展速度和火爆程度着实令人惊叹,一 ...
- Jenkins : 安装 master 和 slave
目录 安装 master 安装 slave 设置 master 与 slave 的通信方式 添加 slave 配置 在 salve 上安装 jre 安装并配置 Jenkins salve Jenkin ...
- WPF 使用 Direct2D1 画图入门
本文来告诉大家如何在 WPF 使用 D2D 画图. 本文是一个系列 WPF 使用 Direct2D1 画图入门 WPF 使用 Direct2D1 画图 绘制基本图形 WPF 使用 SharpDX WP ...
- C#添加IIS站点
利用IIS7自带类库管理IIS现在变的更强大更方便,而完全可以不需要用DirecotryEntry这个类了(乐博网中很多.net管理iis6.0的文章都用到了DirecotryEntry这个类 ),M ...
- Java基础——Oracle(六)
一.数据字典和动态性能视图 数据字典: oracle中的重要组成部分,提供了数据库的一些系统信息,记录了数据库的系统信息,它是只读表和视图的集合,数据字典的所有者为 sys 用户.用户只能在数据字典上 ...
- C#多线程——优先级
在我的公司这里,因为要跟很多特殊的设备打交道,所以会用到多线程的东西,那么我们在进行多线程处理的时候,怎么去设置优先级 我这里用听歌和下载小说做了个例子,我们用电脑的时候肯定是可以边听歌边下载小说的, ...
- HTML5 template元素
前言 转自http://www.zhangxinxu.com/wordpress/2014/07/hello-html5-template-tag/ 在单页面应用,我们对页面的无刷新有了更高的要求,H ...
- 使用普通用户执行 docker
CentOS 版本 7.4,Docker 版本 docker-1.13 及以下 ll /var/run/docker.sock srw-rw----. 1 root root 0 May 25 14: ...
- 【代码笔记】Web-JavaScript-JavaScript语法
一,效果图. 二,代码. <!DOCTYPE html> <html> <head> <meta charset="utf-8"> ...