接任务,赚取用不完的金币中国教程网
《Photoshop专家讲堂》光盘热售
参与论坛活动,快速赚取金币精品素材,中英文字体
发新话题
打印

请教一个树形表的SQL交叉表查询。

请教一个树形表的SQL交叉表查询。


我有一个树形表是这样的  

id      number  lever    name          time  
1            1          1        星期一        
2            1.1      2        语文          上午  
3            1.2      2        数学          上午  
4            1.3      2        英语          下午   
5            1.4      2        政治          下午  
6            2          1        星期二        
7            2.1      2        化学          上午  
8            2.2      2        物理          上午  
9            2.3      2        数学          下午   
10          2.4      2        语文          下午  

......  

如何用SQL查询将结果变为这样?  

星期一    1    上午  语文    数学    下午    英语    政治  
星期二    2    上午  化学    物理    下午    数学    语文  

请教各位。  
---------------------------------------------------------------  

declare  @a  table(id  int,  number  varchar(10),lever  int,name    varchar(10),time  varchar(10))  
insert  @a  select  1,          '1'    ,      1,        '星期一',      null  
union  all  select  2,          '1.1',      2,        '语文'    ,      '上午'  
union  all  select  3,          '1.2',      2,        '数学'    ,      '上午'  
union  all  select  4,          '1.3',      2  ,      '英语'    ,      '下午'   
union  all  select  5,          '1.4',      2  ,      '政治'    ,      '下午'  
union  all  select  6,          '2',      1,        '星期二',      null  
union  all  select  7,          '2.1',      2,        '化学'    ,      '上午'  
union  all  select  8,          '2.2',      2,        '物理'    ,      '上午'  
union  all  select  9,          '2.3',      2,        '数学'    ,      '下午'   
union  all  select  10,        '2.4',      2,        '语文'    ,      '下午'  



select  a.name,b.*  from   
(select  number,name  from  @a  where  lever=1)  a,  
(select  left(number,1)  as  number,  
min(case  when  right(number,1)<=2  then  time  end)  time1,  
min(case  when  right(number,1)=1  then  name  end)  name1,  
min(case  when  right(number,1)=2  then  name  end)  name2,  
min(case  when  right(number,1)>2  then  time  end)  time2,  
min(case  when  right(number,1)=3  then  name  end)  name3,  
min(case  when  right(number,1)=4  then  name  end)  name4  
from  @a  where  lever=2  group  by  left(number,1)  
)  b  where  a.number=b.number  

----------------------------------------  
name              number  time1            name1            name2            time2            name3            name4              
----------  ------  ----------  ----------  ----------  ----------  ----------  ----------   
星期一                1            上午                  语文        数学                  下午          英语                  政治  
星期二                2            上午                  化学        物理                  下午          数学                  语文
发新话题 返回列表