sql语句写法,求高手指点!

QQ1031474372 2012-12-14 08:10:00
student表:
name course grade
张三 语文 10
张三 数学 20
张三 英语 30
李四 语文 50
李四 数学 60
李四 英语 70

用sql语句变成下面这张表:
name 语文 数学 英语
张三 10 20 30
李四 50 60 70
sql语句得到下面这张表!!!
...全文
2853 37 打赏 收藏 转发到动态 举报
写回复
用AI写文章
37 条回复
切换为时间正序
请发表友善的回复…
发表回复
十字刀疤 2013-11-16
  • 打赏
  • 举报
回复
引用 4 楼 songtongrun 的回复:

if object_id('stu','u') is not null
drop table stu

go
create table stu
(
name nvarchar(20),
course nvarchar(10),
grade smallint
)

go
insert into stu values
('张三','语文',10)
insert into stu values
('张三','数学',20)
insert into stu values
('张三','英语',30)
insert into stu values
('李四','语文',50)
insert into stu values
('李四','数学',60)
insert into stu values
('李四','英语',70)
 
 go
select name,
(select max(grade) from stu as u where u.name=t.name and course='数学' ) as 数学,
(select grade from stu as u where u.name=t.name and course='英语' ) as 英语
,(select grade from stu as u where u.name=t.name and course='语文' ) as 语文
from stu as t
group by name

select * from stu
请问为什么出现这么多重复呢 然后用group by 去重复 句子是怎么执行的啊
jooling 2013-11-14
  • 打赏
  • 举报
回复
SELECT DISTINCT A.name, A.grade AS yuwen, B.grade as shuxue, C.grade as yingyu FROM student as A, student as B, student as C WHERE A.name = B.name AND B.name = C.name AND A.course <> B.course AND B.course <> C.course AND A.course <> C.course AND A.course = '语文' AND B.course = '数学' AND C.course = '英语'
t101lian 2013-10-24
  • 打赏
  • 举报
回复
引用 29 楼 u011015550 的回复:
select * from student pivot(max(grade) for course in(语文,数学,英语)) a 05版我试了下不支持这个语句吧
我用的也是05 , 这个支持呀, 只是这个
insert into #aa values
('张三','语文',10),
('张三','数学',20),
('张三','英语',30),
('李四','语文',50),
('李四','数学',60),
('李四','英语',70)
不支持
t101lian 2013-10-24
  • 打赏
  • 举报
回复
引用 1 楼 nidexuanzhe 的回复:

if object_id('student','u') is not null
drop table student

go
create table student
(
name nvarchar(20),
course nvarchar(10),
grade smallint
)

go
insert into student values
('张三','语文',10),
('张三','数学',20),
('张三','英语',30),
('李四','语文',50),
('李四','数学',60),
('李四','英语',70)

go

--SQL
select * from student pivot(max(grade) for course in(语文,数学,英语)) a

--结果集
/*
name 语文 数学 英语
李四 50 60 70
张三 10 20 30
*/
弱弱的问一下,为什么这样不行?
declare
@course varchar (500)
select @course=isnull(@course+',','')+course from #aa group by course
print @course

exec('select * from #aa pivot(max(grade) for course in(@course)) a')
t101lian 2013-10-24
  • 打赏
  • 举报
回复
引用 1 楼 nidexuanzhe 的回复:

if object_id('student','u') is not null
drop table student

go
create table student
(
name nvarchar(20),
course nvarchar(10),
grade smallint
)

go
insert into student values
('张三','语文',10),
('张三','数学',20),
('张三','英语',30),
('李四','语文',50),
('李四','数学',60),
('李四','英语',70)
 
 go
 
 --SQL
 select * from student pivot(max(grade) for course in(语文,数学,英语)) a
 
 --结果集
 /*
name    语文  数学  英语
李四	50	  60	70
张三	10	  20	30
*/
insert into #aa values
('张三','语文',10),
('张三','数学',20),
('张三','英语',30),
('李四','语文',50),
('李四','数学',60),
('李四','英语',70)
这里是不是写的不对呀
fgm2003 2013-09-09
  • 打赏
  • 举报
回复
都是老鸟级的了,几年不写代码的路过
令狐苦瓜 2013-08-22
  • 打赏
  • 举报
回复
http://www.cnblogs.com/zhangzt/archive/2010/07/29/1787825.html
Neo_whl 2013-07-31
  • 打赏
  • 举报
回复
select * from student pivot(max(grade) for course in(语文,数学,英语)) a 05版我试了下不支持这个语句吧
Neo_whl 2013-07-31
  • 打赏
  • 举报
回复
哈哈,都有大牛前途
vb_vs 2013-07-11
  • 打赏
  • 举报
回复
pivot table. 如果column相对少的话,可以用 max (case when end) 来做。 一个个列出来,反而比较简单。
hc1031473635 2013-07-11
  • 打赏
  • 举报
回复
踩踩,看大虾解决方法
lanhu2488 2013-06-20
  • 打赏
  • 举报
回复
LongRui888 2013-04-28
  • 打赏
  • 举报
回复
都是不错的方法。
gongjian0628 2013-04-07
  • 打赏
  • 举报
回复
看来 都学的不错了吗 呵呵
s2871546 2013-02-07
  • 打赏
  • 举报
回复
很多用法,遇到的时候不懂,真正要用了就可以学会了,我也是新手,嘻嘻
lxqlyld 2013-02-07
  • 打赏
  • 举报
回复
你们都是高手,看了这个帖子,小弟学到不少东西啊
xdd451820664 2013-02-05
  • 打赏
  • 举报
回复
使用行列转换
kilior 2013-01-18
  • 打赏
  • 举报
回复
如果科目可变的话 ,建议用游标遍历科目 拼接sql ,然后再次遍历科目进行更新
七色鸟 2013-01-15
  • 打赏
  • 举报
回复
典型的行转列 select * from (select * from student) a pivot (max(分数) for 课程 in (语文,数学,英语)) b
tins11 2013-01-15
  • 打赏
  • 举报
回复
哇塞,我才刚学这个,还不知道能这么整。。。
加载更多回复(14)

6,129

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 新技术前沿
社区管理员
  • 新技术前沿社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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