数据源:
CREATE TABLE kecheng(
k_id int,
day VARCHAR(20) NOT NULL DEFAULT '',
k_name VARCHAR(20) NOT NULL,
morning VARCHAR(20),
afternoon varchar(20),
PRIMARY KEY(`k_id`)
);
insert into kecheng values(1 , '周一' , '语文' , '有课','有课');
insert into kecheng values(2 , '周一' , '数学' , NULL,'有课');
insert into kecheng values(3 , '周三' , '语文' , '有课',NULL);
insert into kecheng values(4 , '周三' , '数学' , NULL,'有课');
insert into kecheng values(5 , '周三' , '英语' , NULL,'有课');
insert into kecheng values(6 , '周五' , '英语' , NULL,NULL);
任务是把
mysql> select * from kecheng;
+------+--------+--------+---------+-----------+
| k_id | day | k_name | morning | afternoon |
+------+--------+--------+---------+-----------+
| 1 | 周一 | 语文 | 有课 | 有课 |
| 2 | 周一 | 数学 | NULL | 有课 |
| 3 | 周三 | 语文 | 有课 | NULL |
| 4 | 周三 | 数学 | NULL | 有课 |
| 5 | 周三 | 英语 | NULL | 有课 |
| 6 | 周五 | 英语 | NULL | NULL |
+------+--------+--------+---------+-----------+
行列转置成:
+--------+---------------+--------+---------------+--------+--------+
| time | 周一 | 周二 | 周三 | 周四 | 周五 |
+--------+---------------+--------+---------------+--------+--------+
| 上午 | 语文 | 无课 | 语文 | 无课 | 无课 |
| 下午 | 数学,语文 | 无课 | 英语,数学 | 无课 | 无课 |
+--------+---------------+--------+---------------+--------+--------+
1,理解为什么行列转是要转成这样,方便comprehensive what outcome should to be。
答:行列转不一定要转成怎样,只是你想要做成怎样,但是把列标转成行标就算行列转了。
2,用怎样的流程实现怎样的目的。
答:
2.1,目的:
±-------+
| time |
±-------+
| 上午 |
| 下午 |
±-------+
select '上午' as time from kecheng
union
select '下午' as time from kecheng
group by time;
2.2 目的:
±-------±--------------±-------±--------------±-------±-------+
| time | 周一 | 周二 | 周三 | 周四 | 周五 |
±-------±--------------±-------±--------------±-------±-------+
因为group by time,所以group_concat().用case when 对表内杂乱的数据做筛选和分组。
case when day=‘周一’ and ifyouke=‘有课’ then k_name else null end :当 day=‘周一’ and ifyouke=‘有课’ 就输出 k_name 否则输出 null。
select time
,ifnull(group_concat(case when day=‘周一’ and ifyouke= ‘有课’ then k_name else null end),‘无课’) as ‘周一’
,ifnull(group_concat(case when day=‘周二’ and ifyouke= ‘有课’ then k_name else null end),‘无课’) as ‘周二’
,ifnull(group_concat(case when day=‘周三’ and ifyouke = ‘有课’ then k_name else null end),‘无课’) as ‘周三’
,ifnull(group_concat(case when day=‘周四’ and ifyouke = ‘有课’ then k_name else null end),‘无课’) as ‘周四’
,ifnull(group_concat(case when day=‘周五’ and ifyouke = ‘有课’ then k_name else null end),‘无课’) as ‘周五’
from
(select day,k_name,‘上午’ as time,morning as ifyouke from kecheng
union
select day,k_name,‘下午’ as time,afternoon as ifyouke from kecheng
) t
group by time;
结果:
+--------+---------------+--------+---------------+--------+--------+
| time | 周一 | 周二 | 周三 | 周四 | 周五 |
+--------+---------------+--------+---------------+--------+--------+
| 上午 | 语文 | 无课 | 语文 | 无课 | 无课 |
| 下午 | 数学,语文 | 无课 | 英语,数学 | 无课 | 无课 |
+--------+---------------+--------+---------------+--------+--------+