sql server多行数据合并显示

现有三个数据表,分别是学生表,课程表,成绩表。它们的结构与样例数据如下:

学生表:
学生Id    姓名
1             张三
2              李四
3             王五

课程表:
课程Id     课程名
1              语文
2             化学
3             外语
4             物理

成绩表
学生Id      课程Id        成绩
1                1                 60
1               2                 70
1                3                 65
1                4                 90
2                1                 80
2               2                 65
2                3                 85
2                4                 80
3                1                 50
3               2                 75
3                3                 85
3                4                 60

现要求在一行中输出每个学生的所有课程的成绩单,显示样例格式如下:
姓名        语文        化学       外语        物理
张三        60            70           65            90
李四        80            65           85            80
王五        50            75           85            60

当大家看到这样的题目时会优先考虑到的是怎样的一条SQL语句呢?嵌套Select?对,在将行转换为列时,也许这种方法是最优先考虑到

SELECT B.姓名,
sql server多行数据合并显示 - jacksun - sunqiangxin 的博客(
SELECT 成绩 FROM 成绩表 INNER JOIN 课程 ON 成绩表.课程ID=课程.课程ID WHERE 成绩表.学生ID=B.学生ID AND 课程.课程名='语文' ) AS 语文,
sql server多行数据合并显示 - jacksun - sunqiangxin 的博客(
SELECT 成绩 FROM 成绩表 INNER JOIN 课程 ON 成绩表.课程ID=课程.课程ID WHERE 成绩表.学生ID=B.学生ID AND 课程.课程名='化学' ) AS 化学,
sql server多行数据合并显示 - jacksun - sunqiangxin 的博客(
SELECT 成绩 FROM 成绩表 INNER JOIN 课程 ON 成绩表.课程ID=课程.课程ID WHERE 成绩表.学生ID=B.学生ID AND 课程.课程名='外语' ) AS 外语,
sql server多行数据合并显示 - jacksun - sunqiangxin 的博客(
SELECT 成绩 FROM 成绩表 INNER JOIN 课程 ON 成绩表.课程ID=课程.课程ID WHERE 成绩表.学生ID=B.学生ID AND 课程.课程名='物理' ) AS 物理
sql server多行数据合并显示 - jacksun - sunqiangxin 的博客
FROM 学生 B

这样我们的目的是达到了,但后来我又想了一下,因为我们要的数据其实都在成绩表里,只不过现有的是用行来存放,那我们 怎么将它转换为列显示呢?嗯,这也许就要搬出聚合函数加Case条件来处理了!最终的SQL语句如下:
SELECT 姓名,
sql server多行数据合并显示 - jacksun - sunqiangxin 的博客
MAX(CASE 课程名 WHEN '语文' THEN 成绩 ELSE 0 END) AS 语文,
sql server多行数据合并显示 - jacksun - sunqiangxin 的博客
MAX(CASE 课程名 WHEN '化学' THEN 成绩 ELSE 0 END) AS 化学,
sql server多行数据合并显示 - jacksun - sunqiangxin 的博客
MAX(CASE 课程名 WHEN '外语' THEN 成绩 ELSE 0 END) AS 外语,
sql server多行数据合并显示 - jacksun - sunqiangxin 的博客
MAX(CASE 课程名 WHEN '物理' THEN 成绩 ELSE 0 END) AS 物理
sql server多行数据合并显示 - jacksun - sunqiangxin 的博客
FROM (SELECT B.姓名,C.课程名,D.成绩 FROM 成绩表 D
sql server多行数据合并显示 - jacksun - sunqiangxin 的博客
INNER JOIN 学生 B ON B.学生ID=D.学生ID
sql server多行数据合并显示 - jacksun - sunqiangxin 的博客
INNER JOIN 课程 C ON C.课程ID=D.课程ID) AS TMP GROUP BY 姓名

运行后,也是可以得到正确的数据,下面给出测试代码,大家可以直接在SQL查询分析器里运行
sql server多行数据合并显示 - jacksun - sunqiangxin 的博客
sql server多行数据合并显示 - jacksun - sunqiangxin 的博客
--方法一
sql server多行数据合并显示 - jacksun - sunqiangxin 的博客
SELECT B.姓名,
sql server多行数据合并显示 - jacksun - sunqiangxin 的博客(
SELECT 成绩 FROM 成绩表 INNER JOIN 课程 ON 成绩表.课程ID=课程.课程ID WHERE 成绩表.学生ID=B.学生ID AND 课程.课程名='语文' ) AS 语文,
sql server多行数据合并显示 - jacksun - sunqiangxin 的博客(
SELECT 成绩 FROM 成绩表 INNER JOIN 课程 ON 成绩表.课程ID=课程.课程ID WHERE 成绩表.学生ID=B.学生ID AND 课程.课程名='化学' ) AS 化学,
sql server多行数据合并显示 - jacksun - sunqiangxin 的博客(
SELECT 成绩 FROM 成绩表 INNER JOIN 课程 ON 成绩表.课程ID=课程.课程ID WHERE 成绩表.学生ID=B.学生ID AND 课程.课程名='外语' ) AS 外语,
sql server多行数据合并显示 - jacksun - sunqiangxin 的博客(
SELECT 成绩 FROM 成绩表 INNER JOIN 课程 ON 成绩表.课程ID=课程.课程ID WHERE 成绩表.学生ID=B.学生ID AND 课程.课程名='物理' ) AS 物理
sql server多行数据合并显示 - jacksun - sunqiangxin 的博客
FROM 学生 B
sql server多行数据合并显示 - jacksun - sunqiangxin 的博客
sql server多行数据合并显示 - jacksun - sunqiangxin 的博客
--方法二
sql server多行数据合并显示 - jacksun - sunqiangxin 的博客
SELECT 姓名,
sql server多行数据合并显示 - jacksun - sunqiangxin 的博客
MAX(CASE 课程名 WHEN '语文' THEN 成绩 ELSE 0 END) AS 语文,
sql server多行数据合并显示 - jacksun - sunqiangxin 的博客
MAX(CASE 课程名 WHEN '化学' THEN 成绩 ELSE 0 END) AS 化学,
sql server多行数据合并显示 - jacksun - sunqiangxin 的博客
MAX(CASE 课程名 WHEN '外语' THEN 成绩 ELSE 0 END) AS 外语,
sql server多行数据合并显示 - jacksun - sunqiangxin 的博客
MAX(CASE 课程名 WHEN '物理' THEN 成绩 ELSE 0 END) AS 物理
sql server多行数据合并显示 - jacksun - sunqiangxin 的博客
FROM (SELECT B.姓名,C.课程名,D.成绩 FROM 成绩表 D
sql server多行数据合并显示 - jacksun - sunqiangxin 的博客
INNER JOIN 学生 B ON B.学生ID=D.学生ID
sql server多行数据合并显示 - jacksun - sunqiangxin 的博客
INNER JOIN 课程 C ON C.课程ID=D.课程ID) AS TMP GROUP BY 姓名
sql server多行数据合并显示 - jacksun - sunqiangxin 的博客
sql server多行数据合并显示 - jacksun - sunqiangxin 的博客
sql server多行数据合并显示 - jacksun - sunqiangxin 的博客
DROP TABLE 学生
sql server多行数据合并显示 - jacksun - sunqiangxin 的博客
DROP TABLE 课程
sql server多行数据合并显示 - jacksun - sunqiangxin 的博客
DROP TABLE 成绩表

posted @ 2011-05-13 18:07  Alex.Net  阅读(567)  评论(0编辑  收藏  举报