[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 |
+-------------+----------------+---+