create table test
(
deal_date varchar(10),
week_name varchar(10),
person_name varchar(20),
time_name varchar(20),
attend_result varchar(10)
)
go
insert into test
select '2009-04-20','星期一','肖湘','上午课','旷课' union
select '2009-04-20','星期一','肖湘','下午课','正常' union
select '2009-04-21','星期二','肖湘','上午课','正常' union
select '2009-04-21','星期二','肖湘','下午课','旷课' union
select '2009-04-22','星期三','肖湘','上午课','旷课' union
select '2009-04-22','星期三','肖湘','下午课','旷课' union
select '2009-04-20','星期一','陈阳','上午课','旷课' union
select '2009-04-20','星期一','陈阳','下午课','旷课' union
select '2009-04-21','星期二','陈阳','上午课','正常' union
select '2009-04-21','星期二','陈阳','下午课','旷课' union
select '2009-04-22','星期三','陈阳','上午课','旷课' union
select '2009-04-22','星期三','陈阳','下午课','正常'
原始记录:
时间 星期 姓名 课时 状态
2009-04-20 星期一 陈阳 上午课 旷课
2009-04-20 星期一 陈阳 下午课 旷课
2009-04-20 星期一 肖湘 上午课 旷课
2009-04-20 星期一 肖湘 下午课 正常
2009-04-21 星期二 陈阳 上午课 正常
2009-04-21 星期二 陈阳 下午课 旷课
2009-04-21 星期二 肖湘 上午课 正常
2009-04-21 星期二 肖湘 下午课 旷课
2009-04-22 星期三 陈阳 上午课 旷课
2009-04-22 星期三 陈阳 下午课 正常
2009-04-22 星期三 肖湘 上午课 旷课
2009-04-22 星期三 肖湘 下午课 旷课
......
转换后的格式要求如下:
姓名 星期一 星期二 星期三 ......
上午课 下午课 上午课 下午课 上午课 下午课
陈阳 旷课 旷课 正常 旷课 旷课 正常
肖湘 旷课 正常 正常 旷课 旷课 旷课
请大家帮忙看看如何实现这样的交叉报表?
------解决方案--------------------
- SQL code
select (case when 星期='星期一' and 课时='上午' then 状态 end) as '星期一上午',.....from tbgroup by 姓名
------解决方案--------------------
简单的例子:
- SQL code
select 姓名, [星期一上午课]=max(case when week_name='星期一' and time_name='上午课' then attend_result end), [星期一下午课]=max(case when week_name='星期一' and time_name='下午课' then attend_result end), [星期二上午课]=max(case when week_name='星期二' and time_name='上午课' then attend_result end), [星期二下午课]=max(case when week_name='星期二' and time_name='下午课' then attend_result end), [星期三上午课]=max(case when week_name='星期三' and time_name='上午课' then attend_result end), [星期三下午课]=max(case when week_name='星期三' and time_name='下午课' then attend_result end)from testgroup by 姓名
------解决方案--------------------
- SQL code
create table test ( deal_date varchar(10), week_name varchar(10), person_name varchar(20), time_name varchar(20), attend_result varchar(10) ) go insert into test select '2009-04-20','星期一','肖湘','上午课','旷课' union select '2009-04-20','星期一','肖湘','下午课','正常' union select '2009-04-21','星期二','肖湘','上午课','正常' union select '2009-04-21','星期二','肖湘','下午课','旷课' union select '2009-04-22','星期三','肖湘','上午课','旷课' union select '2009-04-22','星期三','肖湘','下午课','旷课' union select '2009-04-20','星期一','陈阳','上午课','旷课' union select '2009-04-20','星期一','陈阳','下午课','旷课' union select '2009-04-21','星期二','陈阳','上午课','正常' union select '2009-04-21','星期二','陈阳','下午课','旷课' union select '2009-04-22','星期三','陈阳','上午课','旷课' union select '2009-04-22','星期三','陈阳','下午课','正常' select person_name, [星期一上午课]=max(case when week_name='星期一' and time_name='上午课' then attend_result end), [星期一下午课]=max(case when week_name='星期一' and time_name='下午课' then attend_result end), [星期二上午课]=max(case when week_name='星期二' and time_name='上午课' then attend_result end), [星期二下午课]=max(case when week_name='星期二' and time_name='下午课' then attend_result end), [星期三上午课]=max(case when week_name='星期三' and time_name='上午课' then attend_result end), [星期三下午课]=max(case when week_name='星期三' and time_name='下午课' then attend_result end)from testgroup by person_name/*person_name 星期一上午课 星期一下午课 星期二上午课 星期二下午课 星期三上午课 星期三下午课 -------------------- ---------- ---------- ---------- ---------- ---------- ---------- 陈阳 旷课 旷课 正常 旷课 旷课 正常肖湘 旷课 正常 正常 旷课 旷课 旷课*/drop table testgo