求助各位大神,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
这个是实现:
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,求助关于数据库创建问题,多谢!!