sql如何得到课程表 好像不简单

mills_ 2011-01-15 11:18:17
先谢谢关注的哥们、姐们!
问题:
有下面这样的表:

姓名 上课时间 日期 课程
张三 9:00:00 星期一 数学
张三 14:00:00 星期二 英语
张三 19:00:00 星期二 数学

怎样才能得掉下面这样的课程表呢?

*****星期一 星期二 星期三 星期四 星期五 星期六 星期日
上午 数学
下午 (占位) 英语
晚上(占位)英语


自己查了下,发现挺复杂的!本人愚钝没能看懂!那么拜托各位了!
...全文
103 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
-晴天 2011-01-16
  • 打赏
  • 举报
回复
那就参照这个吧:
Create table Class([Student] nvarchar(2),[Course] nvarchar(2),[Score] int)
Insert Class
select N'张三',N'语文',78 union all
select N'张三',N'数学',87 union all
select N'张三',N'英语',82 union all
select N'张三',N'物理',90 union all
select N'李四',N'语文',65 union all
select N'李四',N'数学',77 union all
select N'李四',N'英语',65 union all
select N'李四',N'物理',85
Go
--2000方法:
动态:

declare @s nvarchar(4000)
set @s=''
Select @s=@s+','+quotename([Course])+'=max(case when [Course]='+quotename([Course],'''')+' then [Score] else 0 end)'
from Class group by[Course]
exec('select [Student]'+@s+' from Class group by [Student]')
mills_ 2011-01-16
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 qianjin036a 的回复:]
SQL code
create table kb(姓名 nvarchar(10),上课时间 varchar(8),日期 nvarchar(8),课程 nvarchar(10))
insert into kb select '张三','9:00:00','星期一','数学'
insert into kb select '张三','14:00:00','星期二','英语'
insert int……
[/Quote]


不好意思,我的是2000 没有cte
可以怎么改呢?
-晴天 2011-01-16
  • 打赏
  • 举报
回复
create table kb(姓名 nvarchar(10),上课时间 varchar(8),日期 nvarchar(8),课程 nvarchar(10))
insert into kb select '张三','9:00:00','星期一','数学'
insert into kb select '张三','14:00:00','星期二','英语'
insert into kb select '张三','19:00:00','星期二','数学'
go
;with cte as(
select (case when datepart(hh,上课时间)<12 then '上午' when datepart(hh,上课时间)>18 then '晚上' else '下午'end)as 时间,日期,课程 from kb
)select * from cte pivot (max([课程]) for [日期] in([星期一],[星期二],[星期三],[星期四],[星期五],[星期六],[星期日]))b
go
drop table kb
/*
时间 星期一 星期二 星期三 星期四 星期五 星期六 星期日
---- ---------- ---------- ---------- ---------- ---------- ---------- ----------
上午 数学 NULL NULL NULL NULL NULL NULL
晚上 NULL 数学 NULL NULL NULL NULL NULL
下午 NULL 英语 NULL NULL NULL NULL NULL

(3 行受影响)
*/
mills_ 2011-01-16
  • 打赏
  • 举报
回复
谢谢(涩(*^__^*)郎) 也谢谢 (晴天)
(涩(*^__^*)郎) 说的也是个问题 所以我就如下解决了!

create table kb(姓名 nvarchar(10),上课时间 varchar(8),日期 nvarchar(8),课程 nvarchar(10))
insert into kb select '张三','9:00:00','星期一','数学'
insert into kb select '张三','14:00:00','星期二','英语'
insert into kb select '张三','19:00:00','星期二','数学'


select convert(varchar(8),时间,108) as 时间,
max(case 日期 when '星期一' then 课程 end) 星期一,
max(case 日期 when '星期二' then 课程 end) 星期二,
max(case 日期 when '星期三' then 课程 end) 星期三,
max(case 日期 when '星期四' then 课程 end) 星期四,
max(case 日期 when '星期五' then 课程 end) 星期五,
max(case 日期 when '星期六' then 课程 end) 星期六,
max(case 日期 when '星期日' then 课程 end) 星期日
from kb
group by 时间

drop table kb

/*
时间 星期一 星期二 星期三 星期四 星期五 星期六 星期日
---- ---------- ---------- ---------- ---------- ---------- ---------- ----------
9:00:00 数学 NULL NULL NULL NULL NULL NULL
14:00:00 NULL 数学 NULL NULL NULL NULL NULL
19:00:00 NULL 英语 NULL NULL NULL NULL NULL

(3 行受影响)
*/

快溜 2011-01-15
  • 打赏
  • 举报
回复
如果星期一上午有两节课,你的表什么样子?
-晴天 2011-01-15
  • 打赏
  • 举报
回复
行转列.

22,209

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 疑难问题
社区管理员
  • 疑难问题社区
  • 尘觉
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧