当前位置: 代码迷 >> Sql Server >> 一个感觉有点难度的交叉报表,请大家帮忙?解决方案
  详细解决方案

一个感觉有点难度的交叉报表,请大家帮忙?解决方案

热度:16   发布时间:2016-04-27 13:06:53.0
一个感觉有点难度的交叉报表,请大家帮忙?
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
  相关解决方案