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

有两张表,其中一张是学生表(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

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)
温馨提示:答案为网友推荐,仅供参考
第1个回答  2012-05-10
这种可以用数据透视表来解决!
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