行列转换的帖子mysql_[转载]mysql行列转换方法总结  (转)

数据样本:

create table

tx(

id int primary key,

c1 char(2),

c2 char(2),

c3 int

);

insert into tx

values

(1 ,'A1','B1',9),

(2 ,'A2','B1',7),

(3 ,'A3','B1',4),

(4 ,'A4','B1',2),

(5 ,'A1','B2',2),

(6 ,'A2','B2',9),

(7 ,'A3','B2',8),

(8 ,'A4','B2',5),

(9 ,'A1','B3',1),

(10 ,'A2','B3',8),

(11 ,'A3','B3',8),

(12 ,'A4','B3',6),

(13 ,'A1','B4',8),

(14 ,'A2','B4',2),

(15 ,'A3','B4',6),

(16 ,'A4','B4',9),

(17 ,'A1','B4',3),

(18 ,'A2','B4',5),

(19 ,'A3','B4',2),

(20 ,'A4','B4',5);

mysql> select * from tx;

+----+------+------+------+

| id | c1 |

c2 |

c3 |

+----+------+------+------+

| 1 | A1 |

B1 | 9 |

| 2 | A2 |

B1 | 7 |

| 3 | A3 |

B1 | 4 |

| 4 | A4 |

B1 | 2 |

| 5 | A1 |

B2 | 2 |

| 6 | A2 |

B2 | 9 |

| 7 | A3 |

B2 | 8 |

| 8 | A4 |

B2 | 5 |

| 9 | A1 |

B3 | 1 |

| 10 | A2 |

B3 | 8 |

| 11 | A3 |

B3 | 8 |

| 12 | A4 |

B3 | 6 |

| 13 | A1 |

B4 | 8 |

| 14 | A2 |

B4 | 2 |

| 15 | A3 |

B4 | 6 |

| 16 | A4 |

B4 | 9 |

| 17 | A1 |

B4 | 3 |

| 18 | A2 |

B4 | 5 |

| 19 | A3 |

B4 | 2 |

| 20 | A4 |

B4 | 5 |

+----+------+------+------+

20 rows in set (0.00 sec)

mysql>

期望结果

+------+-----+-----+-----+-----+------+

|C1 |B1 |B2 |B3 |B4 |Total |

+------+-----+-----+-----+-----+------+

|A1 |9 |2 |1 |11 |23 |

|A2 |7 |9 |8 |7 |31 |

|A3 |4 |8 |8 |8 |28 |

|A4 |2 |5 |6 |14 |27 |

|Total |22 |24 |23 |40 |109 |

+------+-----+-----+-----+-----+------+

1. 利用SUM(IF()) 生成列 + WITH ROLLUP 生成汇总行,并利用

IFNULL将汇总行标题显示为 Total

mysql>

SELECT

IFNULL(c1,'total') AS total,

SUM(IF(c2='B1',c3,0)) AS B1,

SUM(IF(c2='B2',c3,0)) AS B2,

SUM(IF(c2='B3',c3,0)) AS B3,

SUM(IF(c2='B4',c3,0)) AS B4,

SUM(IF(c2='total',c3,0)) AS total

FROM (

SELECT c1,IFNULL(c2,'total') AS c2,SUM(c3) AS c3

FROM tx GROUP BY c1,c2

WITH ROLLUP HAVING c1 IS NOT NULL

) AS A

GROUP BY c1

WITH ROLLUP;

+-------+------+------+------+------+-------+

| total | B1 |

B2 |

B3 |

B4 | total |

+-------+------+------+------+------+-------+

| A1 | 9

| 2

| 1

| 11

| 23 |

| A2 | 7

| 9

| 8

| 7

| 31 |

| A3 | 4

| 8

| 8

| 8

| 28 |

| A4 | 2

| 5

| 6

| 14

| 27 |

| total | 22

| 24

| 23

| 40

| 109 |

+-------+------+------+------+------+-------+

5 rows in set, 1 warning (0.00 sec)

2. 利用SUM(IF()) 生成列 + UNION 生成汇总行,并利用 IFNULL将汇总行标题显示为

Total

mysql>

select c1,

sum(if(c2='B1',C3,0)) AS B1,

sum(if(c2='B2',C3,0)) AS B2,

sum(if(c2='B3',C3,0)) AS B3,

sum(if(c2='B4',C3,0)) AS B4,SUM(C3) AS TOTAL

from tx

group by C1

UNION

SELECT 'TOTAL',sum(if(c2='B1',C3,0)) AS B1,

sum(if(c2='B2',C3,0)) AS B2,

sum(if(c2='B3',C3,0)) AS B3,

sum(if(c2='B4',C3,0)) AS B4,SUM(C3) FROM

TX;

+-------+------+------+------+------+-------+

| c1 |

B1 |

B2 |

B3 |

B4 | TOTAL |

+-------+------+------+------+------+-------+

| A1 | 9

| 2

| 1

| 11

| 23 |

| A2 | 7

| 9

| 8

| 7

| 31 |

| A3 | 4

| 8

| 8

| 8

| 28 |

| A4 | 2

| 5

| 6

| 14

| 27 |

| TOTAL | 22

| 24

| 23

| 40

| 109 |

+-------+------+------+------+------+-------+

5 rows in set (0.00 sec)

mysql>

3. 利用SUM(IF())

生成列,直接生成结果不再利用子查询

mysql>

select

ifnull(c1,'total'),

sum(if(c2='B1',C3,0)) AS B1,

sum(if(c2='B2',C3,0)) AS B2,

sum(if(c2='B3',C3,0)) AS B3,

sum(if(c2='B4',C3,0)) AS B4,SUM(C3) AS TOTAL

from tx

group by C1 with rollup ;

+--------------------+------+------+------+------+-------+

| ifnull(c1,'total') | B1 |

B2 |

B3 |

B4 | TOTAL |

+--------------------+------+------+------+------+-------+

|

A1 | 9

| 2

| 1

| 11

| 23 |

|

A2 | 7

| 9

| 8

| 7

| 31 |

|

A3 | 4

| 8

| 8

| 8

| 28 |

|

A4 | 2

| 5

| 6

| 14

| 27 |

|

total | 22

| 24

| 23

| 40

| 109 |

+--------------------+------+------+------+------+-------+

5 rows in set (0.00 sec)

mysql>

4. 动态,适用于列不确定情况,

mysql> SET @EE='';

mysql> SELECT

@EE:=CONCAT(@EE,'SUM(IF(C2='',C2,''',',C3,0)) AS ',C2,',') FROM

(SELECT DISTINCT C2 FROM TX) A;

mysql> SET @QQ=CONCAT('SELECT

ifnull(c1,'total'),',LEFT(@EE,LENGTH(@EE)-1),' ,SUM(C3) AS TOTAL

FROM TX GROUP BY C1 WITH ROLLUP');

Query OK, 0 rows affected (0.00 sec)

mysql> PREPARE stmt2 FROM @QQ;

Query OK, 0 rows affected (0.00 sec)

Statement prepared

mysql> EXECUTE stmt2;

+--------------------+------+------+------+------+-------+

| ifnull(c1,'total') | B1 |

B2 |

B3 |

B4 | TOTAL |

+--------------------+------+------+------+------+-------+

|

A1 | 9

| 2

| 1

| 11

| 23 |

|

A2 | 7

| 9

| 8

| 7

| 31 |

|

A3 | 4

| 8

| 8

| 8

| 28 |

|

A4 | 2

| 5

| 6

| 14

| 27 |

|

total | 22

| 24

| 23

| 40

| 109 |

+--------------------+------+------+------+------+-------+

5 rows in set (0.00 sec)

mysql>

其实数据库中也可以用 CASE WHEN /

DECODE 代替 IF

sum(if(c2='B1',C3,0)) AS B1

可改写为

sum(case c2 when 'B1' then C3 else 0 end) AS B1

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/551050.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

mysql 查询一个月的时间_mysql日期查询sql语句总结(查询一天,查询一周,查询一个月的数据)...

我的日期首先我们获取到的日期格式是这样的:2009-2-12或者2009-3-3或者2009-10-12,我们在组合sql语句的时候可以这样:(分了三个例子)代码如下1select * from user where birthday>2009-2-3 and birthday这样我们能够查到所有包括2009-2-3并…

html在线摄像头,在HTML里加载摄像头的方法

效果图: 整体效果:视频加载:拍照:第一步:创建HTML元素首先,我们要创建一个HTML5的文档。无标题文档然后在插入以下代码:截图第二步:创建JavaScript首先,要在里创建一个JavaScript&am…

node mysql 跨库查询_nodejs 在mongodb在跨数据库之中如何进行关联起来查询,并且支持筛选关联表的条件进行查询...

"班级数据库": "mongodb://192.168.3.17/xxx"学生数据库": "mongodb://192.168.3.99/xxx (只读)使用 mongoose.createConnection 进行链接2个数据库classId 是唯一并且不会重复的。学生数据库是只读的,并且数量非常大,并随…

html5群组选择器,css选择器

基本选择器通配选择器选择器:*类型:通配选择器含义:选择文档中所有的HTML元素元素选择器选择器:E类型:元素选择器含义:选择指定类型的HTML元素ID选择器选择器:#ID类型:ID选择器含义&…

html风车相册代码,Css Html 大风车(示例代码)

简介这篇文章主要介绍了Css Html 大风车(示例代码)以及相关的经验技巧,文章约3675字,浏览量138,点赞数2,值得参考!div{ border-radius: 50%;position: absolute; }.red{border-top:100px solid red;border-right: 100p…

mysql 视图 教程_MySQL视图简介及基本操作教程

前言视图是数据库系统中一种非常有用的数据库对象。MySQL 5.0 之后的版本添加了对视图的支持。认识视图视图是一个虚拟表,其内容由查询定义。同真实表一样,视图包含一系列带有名称的列和行数据,但视图并不是数据库真实存储的数据表。视图是从…

计算机科学导论考试A卷试题,09级计算机科学导论A卷答案

《计算机科学导论》试卷A参考答案一、单选题:(每题1分,共30分)1~5 CBCCD 6~10 ABABC 11~15 DCCDD 16~20 BBBAC 21~25 DDCDC 26~30 ACABC二、填空题:(每空1分,共20分) 1.322.ROM RAM 3.地址4&…

java中连接mysql数据库_java中怎么连接mysql数据库

展开全部import java.sql.Connection;import java.sql.DriverManager;import java.sql.PreparedStatement;import java.text.SimpleDateFormat;import java.util.Date;public class JDBCMySQL {// 驱动程序就是之前在classpath中配置的jdbc的驱动程序的jar包中public static fi…

html文件打开多出很多数字,【求助】页面上显示几个数字,打开html的时候希望能滚动起来...

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼*{padding: 0;margin: 0;}div{width:60px;height:50px;border:1px solid red;overflow: hidden;position: relative;margin: 200px 400px;}ul{width:200px;height:20px;float:left;position: absolute;}li{width:10px;height:20px;…

word 转 html cms,Java 将Word文件转换为HTML格式文件

前言:在很多时候我们都需要到项目中导入word文档,但是后期再次在前段显示这个文档的时候前端往往需要的是html格式的,所以这个时候就会提出一个需求: 你们存文档的时候能不能存成html格式的? 于是这篇文章的内容就可以…

mysql 中函数如何转存_mysql 导入导出数据库以及函数、存储过程 【转】

MySQL常用导出数据命令:1.mysql导出整个数据库mysqldump -hhostname -uusername -ppassword databasename > backupfile.sqlmysqldump -hlocalhost -uroot hqgr> hqgr.sql (如果root用户没用密码可以不写-p,当然导出的sql文件你可以制定一个路…

1500度的近视能学计算机吗,1500度近视考驾照,近视多少度不能考驾照

情人眼里出西施,所以眼睛的地位真的无可替代,让我们认识了这个五彩缤纷的世界。但是也有一批深度近视的人群,他们也想像常人一样考取驾照,掌握这个社会的基本技能。有的人说近视1500度不能考取驾照,真的是这样吗&#…

mysql怎样实现先判断后联合_MYSQ创建联合索引,字段的先后顺序,对查询的影响分析...

MYSQ创建联合索引,字段的先后顺序,对查询的影响分析前言对于联合索引我们知道,在使用的时候有一个最左前缀的原则,除了这些呢,比如字段放置的位置,会不会对索引的效率产生影响呢?最左匹配原则联…

上海事业编制 计算机 待遇怎么样,事业单位情况

2010-09-12我们在公路系统工作,用工单位是事业单位编制,由上级部门批准招录下达指标。由于单位缺人,单位临时招录我们(不带指标),我们已工作八年,自2003-2009一直签订合同,2009年到期后至今未签订合同&…

mysql count count id_mysql 为什么count(*)快于count(id)

其实,挺正常的,count的用法大概有两个,不过一般大家不太注意:统计某个列( 俗称字段 )有多少个有效值,也就是值不是null的有多少个。统计记录有多少行,我背诵过的规则是这样的:当count()括弧的表…

如何修改操作系统运行服务器,如何设置Bios 最常见bios设置与修改详细图解教程...

平时我们在使用计算机的时候一般很少会接触到BIOS,很多人都是在安装操作系统时才接触到的,因为在使用光盘安装系统时需将计算机的BIOS设置为从光驱启动,在重装系统、设置硬盘模式以及一些特殊情况都需要进入bios里面,进行相关设置…

mysql 回滚失败_Mysql非事务表回滚失败的现象

执行ROLLBACK(回滚)时,如果收到下述消息,表示事务中使用的1个或多个表不支持事务: 警告:某些更改的非事务性表不能被回滚。 这些非事务性表不受ROLLBACK语句的影响。 如果在事务中意外地混合了事务性表和非事务性表,导…

在线服务器和客户端聊天,实验三、客户端和服务器能实现简单的聊天功能

《实验三、客户端和服务器能实现简单的聊天功能》由会员分享,可在线阅读,更多相关《实验三、客户端和服务器能实现简单的聊天功能(6页珍藏版)》请在人人文库网上搜索。1、实验三、客户端和服务器能实现简单的聊天功能1、实验目的:熟悉基于流式…

mysql连表查询on条件_mysql 外连接的时候,条件在on后面和条件在where后面的区别...

最近使用mysql的时候碰到一个问题:当一个表外联另一个表的时候,将一些查询条件放在on后面和放在where后面不太一样:学生分数表stuscore:当查询语句如下(查询语句1):SELECT a.name,a.subject,a.score,a.stuid ,b.name,b…

应运ajax的几种语言,Ajax指的是什么

Ajax指的是什么发布时间:2020-08-05 14:18:52来源:亿速云阅读:103作者:小新这篇文章将为大家详细讲解有关Ajax指的是什么,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可…