在sqlite

时间:2016-11-19 03:22:01

标签: sql sqlite concatenation

我正在使用sqlite 3.15.1。

我有一张表master,其中包含大学的主时间表。

看起来像:

day         sem         sec         hour        sub_id    
----------  ----------  ----------  ----------  ----------   
MON         5           B           4           10IS51 
MON         5           B           4           10IS53   
MON         5           B           5           10CS54    
MON         5           B           6           10CS55    
MON         5           B           7           10CS53    
MON         3           A           1           10CS33   

还有更多价值......

相同的其他值有多个sub_id ,意思是 - 在星期一的第一个小时,第5个B学生可能有2个或更多个实验室(sub_id)。 (分批进行)。

为了得到一个合适的时间表,我这样做:

select day,
max( case when hour =1 then sub_id end ) as 'hour-1',
max( case when hour =2 then sub_id end ) as 'hour-2',
max( case when hour =3 then sub_id end ) as 'hour-3',
max( case when hour =4 then sub_id end ) as 'hour-4',
max( case when hour =5 then sub_id end ) as 'hour-5',
max( case when hour =6 then sub_id end ) as 'hour-6',
max( case when hour =7 then sub_id end ) as 'hour-7',
max( case when hour =8 then sub_id end ) as 'hour-8'
from master
where sem=5 and sec='B'
group by day
order by day;

但是当出现多个值时,它只给出一个值,即max()值。当我使用min()时,我得到min()值。 我如何同时获得两者?

结果视图如下:

day         hour-1      hour-2      hour-3      hour-4      hour-5      hour-6      hour-7      hour-8    
----------  ----------  ----------  ----------  ----------  ----------  ----------  ----------  ----------
FRI         10CS52      10CS54      10CS53      10CS55      HRD         HRD         TUT                   
MON         10CSL58     10CSL58     10CSL58     10IS51      10CS54      10CS55      10CS53                
SAT         10IS51      10CS55      10CS56      10CS52                                                    
THU         10CS53      10IS51      10CS54      10CS52                                                    
TUE         10CS54      10CS52      10CS56      10CS56                                                    
WED         10CS56      10IS51      10CS53      10CS55      CSA         CSA         CSA                   

但我想要这样的事情:

day         hour-1           hour-2          hour-3      hour-4      hour-5      hour-6      hour-7      hour-8    
----------  ----------      ----------       ----------  ----------  ----------  ----------  ----------  ----------
FRI         10CS52,10CS53   10CS54           10CS53      10CS55      HRD         HRD         TUT                   
MON         10CSL58         10CSL58,10CSL33  10CSL58     10IS51      10CS54      10CS55      10CS53                
SAT         10IS51,10IS48   10CS55           10CS56      10CS52                                                    
THU         10CS53          10IS51           10CS54      10CS52                                                    
TUE         10CS54          10CS52           10CS56      10CS56                                                    
WED         10CS56          10IS51           10CS53      10CS55      CSA         CSA         CSA   

即,所有类 - 逗号分隔,而不是min()或max()。

有可能实现这一目标吗?请帮帮我。

感谢。

1 个答案:

答案 0 :(得分:2)

用GROUP_CONCAT替换MIN / MAX

select day,
group_concat( case when hour =1 then sub_id end ) as 'hour-1',
group_concat( case when hour =2 then sub_id end ) as 'hour-2',
group_concat( case when hour =3 then sub_id end ) as 'hour-3',
group_concat( case when hour =4 then sub_id end ) as 'hour-4',
group_concat( case when hour =5 then sub_id end ) as 'hour-5',
group_concat( case when hour =6 then sub_id end ) as 'hour-6',
group_concat( case when hour =7 then sub_id end ) as 'hour-7',
group_concat( case when hour =8 then sub_id end ) as 'hour-8'
from master
where sem=5 and sec='B'
group by day
order by day;