SQL行列转置教学习题

数据源:

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   | 周一          | 周二   | 周三          | 周四   | 周五   |
+--------+---------------+--------+---------------+--------+--------+
| 上午   | 语文          | 无课   | 语文          | 无课   | 无课   |
| 下午   | 数学,语文     | 无课   | 英语,数学     | 无课   | 无课   |
+--------+---------------+--------+---------------+--------+--------+

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值