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
可能会有Time3列
求SQL 文啊 高手
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
可能会有Time3列
求SQL 文啊 高手
解决方案
10
修改成下面语句好点
select id, case when SUBSTR(a,1,4)="7:00"then SUBSTR(a,1,4) end time1, case when SUBSTR(a,1,4)="8:00"then SUBSTR(a,1,4) when SUBSTR(a,5,4)="8:00"then SUBSTR(a,5,4) end time2, case when SUBSTR(a,1,4)="9:00"then SUBSTR(a,1,4) when SUBSTR(a,5,4)="9:00"then SUBSTR(a,5,4) when SUBSTR(a,9,4)="9:00"then SUBSTR(a,9,4) end time3, date from (select id,date, replace(GROUP_CONCAT(time),",","") as a from t_time a group by id,date ) b;
30
大致的语句就是这样:
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;
运行结果:
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)