博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
mysql 行列动态转换(列联表,交叉表)
阅读量:4581 次
发布时间:2019-06-09

本文共 2553 字,大约阅读时间需要 8 分钟。

mysql 行列动态转换(列联表,交叉表)

(1)动态,适用于列不确定情况

create table table_name(
 id int primary key,
 col1 char(2),
 col2 char(2),
 col3 int
);
insert into table_name 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);
select * from table_name;
+----+------+------+------+
| id | col1 | col2 | col3 |
+----+------+------+------+
|  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 |
+----+------+------+------+
SET @EE='';
SELECT @EE:=CONCAT(@EE,'SUM(IF(col2=\'',col2,'\'',',col3,0)) AS ',col2,',') FROM (SELECT DISTINCT col2 FROM table_name) A;
SET @QQ=CONCAT('SELECT ifnull(col1,\'total\') AS columnA,',LEFT(@EE,LENGTH(@EE)-1),' ,SUM(col3) AS TOTAL FROM table_name GROUP BY col1 WITH ROLLUP');
PREPARE stmt2 FROM @QQ;
EXECUTE stmt2;
+---------+------+------+------+------+-------+
| columnA | 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 |
+---------+------+------+------+------+-------+

 

(2)第二个字段确定的情况下使用

SELECT

   IFNULL(col1,'total') AS total,
   SUM(IF(col2='B1',col3,0)) AS B1,
   SUM(IF(col2='B2',col3,0)) AS B2,
   SUM(IF(col2='B3',col3,0)) AS B3,
   SUM(IF(col2='B4',col3,0)) AS B4,
   SUM(IF(col2='total',col3,0)) AS total
 FROM (
   SELECT col1,IFNULL(col2,'total') AS col2,SUM(col3) AS col3
   FROM table_name
   GROUP BY col1,col2
   WITH ROLLUP
   HAVING col1 IS NOT NULL
 ) AS A
 GROUP BY col1
 WITH ROLLUP;

 

注:  WITH ROLLUP 用于列上求和;  SUM(IF(col2='total',col3,0)) AS total 用于行上求和。

 

(3)第二个字段确定的情况下使用

 select ifnull(col1,'total') AS col1,

 sum(if(col2='B1',col3,0)) AS B1,
 sum(if(col2='B2',col3,0)) AS B2,
 sum(if(col2='B3',col3,0)) AS B3,
 sum(if(col2='B4',col3,0)) AS B4,SUM(col3) AS TOTAL
 from table_name
 group by col1 with rollup ;

 

REF:

http://blog.chinaunix.net/uid-7692530-id-2567582.html

 

转载于:https://www.cnblogs.com/emanlee/p/3550149.html

你可能感兴趣的文章
kafka-Streams
查看>>
ROS2 MAC OS Install
查看>>
SQLServer 基础
查看>>
SQL 查询横表变竖表
查看>>
异常处理.
查看>>
JAVA比较两张图相似度
查看>>
SQL 中怎么查询数据库中具有的表、存储过程、试图数目、总触发器数、作业数...
查看>>
分布式缓存Redis集群配置使用
查看>>
pycharm中安装扩展包
查看>>
类库 委托 var万能类型
查看>>
我的英语提升计划----第三篇
查看>>
《计算机图形学》2.2.2 光栅扫描显示处理器
查看>>
命令行方式使用abator.jar生成ibatis相关代码和sql语句xml文件
查看>>
使用Java实现单线程模式
查看>>
Web Client Software Factory中CreateNew的使用
查看>>
npm,cnpm,yarn
查看>>
在Activity之间传递参数(一)
查看>>
关于浏览器的选择 360浏览器 firefox chrome
查看>>
Fiddler工具的过滤功能介绍
查看>>
django自定义分页器
查看>>