表内容:
id name xk
1 A 学科1
2 A 学科2
3 A 学科3
4 B 学科2
5 B 学科3
希望转成
name xk xk xk
A 学科1 学科2 学科3
B 学科2 学科3
原因是学科数量不定,所以不能用case when then判断学科名
id name xk
1 A 学科1
2 A 学科2
3 A 学科3
4 B 学科2
5 B 学科3
希望转成
name xk xk xk
A 学科1 学科2 学科3
B 学科2 学科3
原因是学科数量不定,所以不能用case when then判断学科名
解决方案
10
转完的列有几列?规则最好说一下。三个xk 列,然后第一个A是学科1 B是学科2
10
http://blog.csdn.net/acmain_chm/article/details/4283943
MySQL交叉表
在某些数据库中有交叉表,但在MySQL中却没有这个功能,但网上看到有不少朋友想找出一个解决方法,特发贴集思广义。http://topic.csdn.net/u/20090530/23/0b782674-4b0b-4cf5-bc1a-e8914aaee5ab.html?96198现整理解法如下:数据样本: create table tx( id int primary key, c1 c…
MySQL交叉表
在某些数据库中有交叉表,但在MySQL中却没有这个功能,但网上看到有不少朋友想找出一个解决方法,特发贴集思广义。http://topic.csdn.net/u/20090530/23/0b782674-4b0b-4cf5-bc1a-e8914aaee5ab.html?96198现整理解法如下:数据样本: create table tx( id int primary key, c1 c…
10
假如学科不固定,那就得用动态行转列的方法了。
给你一个行转列的例子:
给你一个行转列的例子:
mysql 行列转换
A 表
id time date
1 7:00 20160105
1 8:00 20160105
1 7:00 20160104
2 7:00 20160104
转换后的期望结果
id time1 time2 date
1 7:00 20160104
2 7:00 20160104
1 7:00 8:00 20160105
--1.建表
drop table if exists t_time;
CREATE TABLE `t_time` (
`id` int(11) ,
`time` varchar(10) ,
`date` varchar(10)
);
INSERT INTO `test`.`t_time` (`id`, `time`, `date`) VALUES ("1", "7:00", "20160105");
INSERT INTO `test`.`t_time` (`id`, `time`, `date`) VALUES ("1", "8:00", "20160105");
INSERT INTO `test`.`t_time` (`id`, `time`, `date`) VALUES ("1", "7:00", "20160104");
INSERT INTO `test`.`t_time` (`id`, `time`, `date`) VALUES ("2", "7:00", "20160104");
INSERT INTO `test`.`t_time` (`id`, `time`, `date`) VALUES ("2", "9:00", "20160104");
INSERT INTO `test`.`t_time` (`id`, `time`, `date`) VALUES ("3", "7:00", "20160104");
INSERT INTO `test`.`t_time` (`id`, `time`, `date`) VALUES ("3", "8:00", "20160104");
INSERT INTO `test`.`t_time` (`id`, `time`, `date`) VALUES ("3", "9:00", "20160104");
select id,
SUBSTR(a,1,4) time1,
if(SUBSTR(a,5,4)="8:00",SUBSTR(a,5,4),null) time2,
if(SUBSTR(a,5,4)="9:00",SUBSTR(a,5,4),SUBSTR(a,9,4)) time3,
date
from (select id,date, replace(GROUP_CONCAT(time),",","") as a
from t_time a
group by id,date
) b;
--2.生成动态sql
set @sql = "";
select @sql := concat(@sql,",max(case when time = """,time,""" then time end)") from (select distinct time from t_time)t;
set @sql = concat("select id",@sql,",date from t_time group by id,date");
prepare stmt from @sql;
execute stmt;
--3.执行结果
mysql> set @sql = "";
Query OK, 0 rows affected (0.01 sec)
mysql>
mysql> select @sql := concat(@sql,",max(case when time = """,time,""" then time end)") from (select distinct time from t_time)t;
+--+
| @sql := concat(@sql,",max(case when time = """,time,""" then time end)") |
+--+
| ,max(case when time = "7:00" then time end) |
| ,max(case when time = "7:00" then time end),max(case when time = "8:00" then time end) |
| ,max(case when time = "7:00" then time end),max(case when time = "8:00" then time end),max(case when time = "9:00" then time end) |
+--+
3 rows in set (0.03 sec)
mysql>
mysql> set @sql = concat("select id",@sql,",date from t_time group by id,date");
Query OK, 0 rows affected (0.01 sec)
mysql>
mysql> prepare stmt from @sql;
Query OK, 0 rows affected (0.00 sec)
Statement prepared
mysql>
mysql> execute stmt;
+--+--+--+--+--+
| id | max(case when time = "7:00" then time end) | max(case when time = "8:00" then time end) | max(case when time = "9:00" then time end) | date |
+--+--+--+--+--+
| 1 | 7:00 | NULL | NULL | 20160104 |
| 1 | 7:00 | 8:00 | NULL | 20160105 |
| 2 | 7:00 | NULL | 9:00 | 20160104 |
| 3 | 7:00 | 8:00 | 9:00 | 20160104 |
+--+--+--+--+--+
4 rows in set (0.00 sec)
10
不能单独用1个SQL ,满足不了。
本人做的项目中,也有这类的需求。
使用的是存储过程,返回1个DATESET。 包含2个DATETABLE 结果集。
1个是学生的结果集,一个是对应学科的结果集。
然后在客户端处理。
客户端先画出最大学科列。 例如这些学生中,不同学科总共有3个(画三列,学科1,学科2,学科3)。
然后再循环结果集1(学生)中,依次取结果集2(学科),进行绑定值。
例如学生A 学科1 学科2
学生B 学科1 学科3
学生C 学科2 学科3
最后再绑定界面