[SQL]行列转换

行转列

今天做项目的时候遇到了一个新需求,要求做统计接口的时候显示为:{类别名称:总数}

之前做的显示效果是:

{

​ “类别” : 类别名称,

​ “总数” : 总数

}

一开始百思不得其解,后来有人发了篇博客给我,恍然大悟。看来sql还有很多我们不了解的东西。

SELECT 
SUM(IF(`teshuzouye_type`='1',1,0)) as '作业1',
-- if语句相当于一个三目运算符
-- teshuzouye_type是用来分类的字段
-- 1 是用来求和的值,这里也可以写成字段名
-- 0 是指如果求和字段为null则默认值为0
SUM(IF(`teshuzouye_type`='2',1,0)) as '作业2',
SUM(IF(`teshuzouye_type`='3',1,0)) as '作业3',
SUM(IF(`teshuzouye_type`='4',1,0)) as '作业4'
FROM qy_special_task;
效果:
+-------+-------+-------+-------+
| 作业1 | 作业2  | 作业3 | 作业4  |
+-------+-------+-------+-------+
| 2     | 1     | 0     | 0     |
+-------+-------+-------+-------+

列转行

建表语句:

create table qy_special_task {
	id varchar(20) not null,
	enterprise_id varchar(20) comment '企业id',
	teshuzouye_type varchar(20) comment '类型',
	donghuotask_label varchar(20) comment '动火作业级别',
	PRIMARY KEY(id)
}ENGINE = INNODB DEFAULT CHARSET = utf8;

列转行就是把comment放到每一行里面变成数据

SELECT enterprise_id,'类型' AS type,teshuzouye_type AS T FROM qy_special_task
UNION ALL
SELECT enterprise_id,'动火作业级别' AS course,donghuotask_label AS T FROM qy_special_task
ORDER BY enterprise_id;
-- 1.对重复结果的处理:UNION会去掉重复记录,UNION ALL不会;

-- 2.对排序的处理:UNION会排序,UNION ALL只是简单地将两个结果集合并;

-- 3.效率方面的区别:因为UNION 会做去重和排序处理,因此效率比UNION ALL慢很多;
效果:
+-------------+----------------+---+
| enterprise_id | type         | T |
+-------------+----------------+---+
| 111         | 类型           | 1 |
| 111         | 动火作业级别    | 1 |
| 222         | 类型           | 2 |
| 222         | 动火作业级别    | 2 |
| 333         | 类型           | 1 |
| 333         | 动火作业级别    | 1 |
+-------------+----------------+---+
posted @ 2021-09-11 16:03  Kylin_Seven  阅读(314)  评论(0编辑  收藏  举报