嵌套case when 的问题

jianglai11 2009-04-23 10:25:45
create TABLE tb(
[id] [int] NOT NULL,--主键
[studentid] [int] NULL,--学生id
[classid] [int] NULL,--课程id
[xueyuanid] [nvarchar](10) NULL,--学院id
[year] [int] NULL,--年份
[value] [float] NULL --分数
)
insert tb select '11','2','3','2008','1','33'
insert tb select '12','2','3','2007','1','33'
insert tb select 13,3,3,'2007','1','33'
insert tb select 14,3,4,'2006','1','33'
insert tb select 11,4,4,'2006','1','33'
insert tb select 12,4,4,'2006','1','33'
insert tb select 13,5,5,'2005','1','33'
insert tb select 14,5,6,'2005','1','33'
insert tb select 12,6,5,'2005','1','33'
insert tb select 13,7,6,'2009','1','33'
insert tb select 14,7,6,'2010','1','33'


打算出的结果

-------|------学院a-----------------|----------学院b------------|----------学院c----------|
学生姓名|-----课程一--课程二--课程三---|----课程一--课程二--课程五---|---课程一--课程二--课程四-|

张三 80 90 100 90 80 60 - - - (张三可能属于2个学院,例如双学位,但是没有该院系的为0,或者-)
张四 80 20 10 10 30 20 - - - (张三可能属于2个学院,例如双学位,但是没有该院系的为0,或者-)




感觉应该用case when嵌套完成,老规矩 一句sql 不用动态sql和存储过程。
希望高手帮忙。谢谢,在线等
...全文
825 20 打赏 收藏 转发到动态 举报
写回复
用AI写文章
20 条回复
切换为时间正序
请发表友善的回复…
发表回复
jianglai11 2009-06-03
  • 打赏
  • 举报
回复
自己搞定了结
htl258_Tony 2009-04-24
  • 打赏
  • 举报
回复
[Quote=引用 15 楼 ws_hgo 的回复:]
引用 13 楼 htl258 的回复:
刚洗完澡,看到这贴还在,就帮做了。

最佳敬业奖
[/Quote]
呵呵,过讲过讲
ws_hgo 2009-04-24
  • 打赏
  • 举报
回复
[Quote=引用 13 楼 htl258 的回复:]
刚洗完澡,看到这贴还在,就帮做了。
[/Quote]
最佳敬业奖
ws_hgo 2009-04-24
  • 打赏
  • 举报
回复
哦哦
htl258_Tony 2009-04-24
  • 打赏
  • 举报
回复
刚洗完澡,看到这贴还在,就帮做了。
ws_hgo 2009-04-24
  • 打赏
  • 举报
回复
tony
你居然还在
htl258_Tony 2009-04-24
  • 打赏
  • 举报
回复
if object_id('[tb]') is not null drop table [tb] 
go
create TABLE tb(
[id] [int] NOT NULL,--主键
[studentid] [int] NULL,--学生id
[classid] [int] NULL,--课程id
[year] [int] NULL,--年份
[xueyuanid] [nvarchar](10) NULL,--学院id
[value] [float] NULL --分数
)
insert tb select 11,'2','3','2008','1','33'
insert tb select 12,'2','3','2007','1','33'
insert tb select 13,3,3,'2007','1','33'
insert tb select 14,3,4,'2006','1','33'
insert tb select 15,4,4,'2006','1','33'
insert tb select 16,4,4,'2006','1','33'
insert tb select 17,5,5,'2005','1','33'
insert tb select 18,5,6,'2005','1','33'
insert tb select 19,6,5,'2005','1','33'
insert tb select 20,7,6,'2009','1','33'
insert tb select 21,7,6,'2010','1','33'
go
--select * from tb
declare @s varchar(8000)
set @s='select studentid '
select @s=@s+',sum(case when [year]='+ltrim([year])+' and classid='+ltrim(classid)+' and xueyuanid='+ltrim(xueyuanid)
+' then [value] else 0 end) ['+ltrim([year])+'年-课程'+ltrim(classid)+'-学院'+ltrim(xueyuanid)+']'
from tb
group by [year],classid,xueyuanid
order by [year],classid,xueyuanid
select @s=@s+' from tb group by studentid'
exec(@s)

/*
studentid 2005年-课程5-学院1 2005年-课程6-学院1 2006年-课程4-学院1 2007年-课程3-学院1 2008年-课程3-学院1 2009年-课程6-学院1 2010年-课程6-学院1
----------- ---------------------- ---------------------- ---------------------- ---------------------- ---------------------- ---------------------- ----------------------
2 0 0 0 33 33 0 0
3 0 0 33 33 0 0 0
4 0 0 66 0 0 0 0
5 33 33 0 0 0 0 0
6 33 0 0 0 0 0 0
7 0 0 0 0 0 33 33

(6 行受影响)
*/
taoistong 2009-04-24
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 htl258 的回复:]
SQL codeif object_id('[tb]') is not null drop table [tb]
go
create TABLE tb(
[id] [int] NOT NULL,--主键
[studentid] [int] NULL,--学生id
[classid] [int] NULL,--课程id
[year] [int] NULL,--年份
[xueyuanid] [nvarchar](10) NULL,--学院id
[value] [float] NULL --分数
)
insert tb select 11,'2','3','2008','1','33'
insert tb select 12,'2','3','2007','1','33'
insert tb select 13,3,…
[/Quote]


对了,楼主这个答案算是最佳的了
jianglai11 2009-04-24
  • 打赏
  • 举报
回复
?没别的方法么
jianglai11 2009-04-24
  • 打赏
  • 举报
回复
来个动态的试试?
jianglai11 2009-04-24
  • 打赏
  • 举报
回复
非常感动
-狙击手- 2009-04-23
  • 打赏
  • 举报
回复
课程 学院要是动态的,一句哪成呢?
jianglai11 2009-04-23
  • 打赏
  • 举报
回复
这样好像要写很长。有没有好办法?
  • 打赏
  • 举报
回复
select name,2007年-课程1-学院一=case when 学院=1 and year='2007' and 课程id=3 then 成绩 end,
……

from tb

这样?
jianglai11 2009-04-23
  • 打赏
  • 举报
回复
出这种表头的就可以

姓名 2007年-课程1-学院一,2008年-课程1-学院一,2007年-课程2--学院二,2008年-课程2--学院二,…………后面省略-----

谢谢
jianglai11 2009-04-23
  • 打赏
  • 举报
回复
动态也成。。哎。。
jianglai11 2009-04-23
  • 打赏
  • 举报
回复
其实应该最终出列名为 年+课程+学院应该就行

学生id,2007年-课程1-学院a,2008年-课程1-学院a,2009年-课程1-学院a,,2007年-课程2-学院b *****后面省略
结果的列明是上面的就可以。
htl258_Tony 2009-04-23
  • 打赏
  • 举报
回复
不用动态,那要那好长啊,帮你顶贴,期待高手完成。
  • 打赏
  • 举报
回复
一条语句,全部用case嵌套?
为什么非要这么做呢?完全可以放在临时表来做,这样的话能简化sql语句,并且逻辑思路能清晰一点啊
jianglai11 2009-04-23
  • 打赏
  • 举报
回复
发错了,补充下
-----------|----------------学院a-----------------------------------------|---------------学院b-----------------------------------------|
----学生姓名|-------课程一------|------课程二----------|----------课程三-----|---------课程一----|--------课程二------|-------课程五--------|
- |-2007年-2008年-2009-|-2007年-2008年-2009-|-2007年-2008年-2009-|-2007年-2008年-2009-|-2007年-2008年-2009-|-2007年-2008年-2009-|

张三 80 90 100 90 80 60 - - - (张三可能属于2个学院,例如双学位,但是没有该院系的为0,或者-)
张四 80 20 10 10 30 20 - - - (张三可能属于2个学院,例如双学位,但是没有该院系的为0,或者-)


感觉应该用case when嵌套完成,老规矩 一句sql 不用动态sql和存储过程。
希望高手帮忙。谢谢,在线等

22,206

社区成员

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

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