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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了求助各位大神,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)
参考技术A 这种可以用数据透视表来解决!
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

以上是关于求助各位大神,sql server两表间一对多的关系,如何数据整合到一行数据中,问题举例在问题补充中。谢谢..的主要内容,如果未能解决你的问题,请参考以下文章

求助各位大神,小弟初学IBM DB2,求助关于数据库创建问题,多谢!!

sql一对多的查询代码怎么查?

求助各位大神帮我看下 Unity3d 与 Android 交互的问题

sql 一对多查询

YII 两表间和两模块间的数据库查询

求助各位大神,图标反转的问题