求助各位大神,sql server两表间一对多的关系,如何数据整合到一行数据中,问题举例在问题补充中。谢谢.. 10

有两张表,其中一张是学生表(student),另一张是各科成绩表(grade),各表包含的字段如下:student学生信息表-----------------------... 有两张表,其中一张是学生表(student),另一张是各科成绩表(grade),各表包含的字段如下:
student学生信息表
-----------------------------------------------------
id varchar 学生编号
name varchar 学生姓名

score 学生成绩表
-----------------------------------------------------
id varchar 编号
student_id varchar 学生编号
curse_name varchar 课程名称
score float 成绩

示例数据:
student
id name
1 小李
2 小王

score
id student_id curse_name score
1 1 语文 80
2 2 语文 85
3 1 数学 90
4 2 数学 85

问题:如何通过sql语句得到下面格式的数据?
student_id sdudent_name 语文成绩 数学成绩
1 小李 80 90
2 小王 85 85
展开
 我来答
junailan2
2012-05-10 · 超过32用户采纳过TA的回答
知道答主
回答量:74
采纳率:0%
帮助的人:76万
展开全部
SQL SERVER 2005+实现行列互转可以用PIVOT和UNPIVOT
这个是实现:
SELECT * FROM (
SELECT sc.student_id,st.name,curse_name,score FROM student st JOIN score sc ON st.id=sc.student_id) AS T
PIVOT(SUM(score) FOR curse_name IN (语文,数学)) AS P

不过这不是最完整的解决方案,假设你添加多了几门课程,例如英语,化学,生物之类的,就要在原来的语句里添加相应的项,所以要用动态SQL来实现,方法就是先把score表里的全部课程GROUP BY 出来,生成字符串形式(如‘语文,数学,英语,化学,生物’),用逗号隔开,插入到上面语句的PIVOT表达式的IN中,实现如下:
DECLARE @sql NVARCHAR(MAX)
DECLARE @curseList NVARCHAR(200)

SET @curseList=STUFF(
(SELECT ','+curse_name FROM score GROUP BY curse_name FOR XML PATH('')),1,1,'')

SET @sql='
SELECT * FROM (
SELECT student_id,name AS sdudent_name,curse_name,score FROM student st JOIN score sc ON st.id=sc.student_id) AS T
PIVOT(SUM(score) FOR curse_name IN ('+@curseList+')) AS P'

EXEC(@sql)
DouglasLau
2012-05-10
知道答主
回答量:17
采纳率:0%
帮助的人:5.3万
展开全部
这种可以用数据透视表来解决!
select a.id as student_id,a.name as student_name, ( case b.curse_name when ' 语文成绩 ' then score else 0 end ) as 语文成绩 , ( case b.curse_name when ' 数学成绩' then score else 0 end ) as 数学成绩 from student as a join score as b on a.id=b. student_id group by a.name
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式