日期:2014-05-18  浏览次数:20486 次

一个感觉有点难度的交叉报表,请大家帮忙?
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  tb
group 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
    test
group 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
    test
group by
    person_name

/*
person_name          星期一上午课     星期一下午课     星期二上午课     星期二下午课     星期三上午课     星期三下午课     
-------------------- ---------- ---------- ---------- ---------- ----------