sql server多行数据合并显示

系统 1781 0

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

1             小王
2              小黑

课程 表:
kno         kname

1             语文
2             数学
成绩表
cno         ckno              cf

1                1                86.5
1               2                 98.86
2               1                 86.7
2               2                 86.9

 

create    table  学生表

(  
xno  int  ,
 xname  varchar ( 20

)
go  



insert   into  dbo.学生表 
select   1 , ' 小王 '
union   all  
select   2 , ' 小黑 '  


create   table  课程表
(
kno  int  ,
kname  varchar ( 20 )

)
go

insert   into  课程表
select   1 , ' 语文 '
union   all
select   2 , ' 数学 '





create   table  成绩表
(
cno  int ,
ckno  int ,
cf  float
)




alter   table  成绩表
alter   column  cf 

insert   into  成绩表
select   1 , 1 , 86.5


insert   into  成绩表
select   1 , 2 , 98.86

union   all

select   2 , 1 , 86.7
union   all
select   2 , 2 , 86.9




select   *   from  学生表
select   *   from  课程表
select   *   from  成绩表


现要求在一行中输出每个学生的所有课程的成绩单,显示样例格式如下:
姓名        语文        数学      

小王        60            70          

小黑        80            65          

 

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

 

SELECT  B.xname,
( SELECT  cf  FROM  成绩表  INNER   JOIN  课程表  ON  成绩表.ckno = 课程表.kno  WHERE  成绩表.cno = B.xno  AND  课程表.kname = ' 语文 '  )  AS  语文,
( SELECT  cf  FROM  成绩表  INNER   JOIN  课程表  ON  成绩表.ckno = 课程表.kno  WHERE  成绩表.cno = B.xno  AND  课程表.kname = ' 数学 '  )  AS  数学
FROM  学生表 B

 

这样我们的目的是达到了,但后来我又想了一下,因为我们要的数据其实都在 成绩表 里,只不过现有的是用行来存放,那我们怎么将它转换为列显示呢?嗯,这也许就要搬出聚合函数加Case条件来处理了!最终的SQL语句如下:

SELECT  xname,
MAX ( CASE  kname  WHEN   ' 语文 '   THEN  cf  ELSE   0   END AS  语文,
MAX ( CASE  kname  WHEN   ' 数学 '   THEN  cf  ELSE   0   END AS  数学
FROM  ( SELECT  B.xname,C.kname,D.cf  FROM  成绩表 D 
INNER   JOIN  学生表 B  ON  B.xno = D.cno 
INNER   JOIN  课程表 C  ON  C.kno = D.ckno)  AS  ZH  GROUP   BY  xname


 

运行后,也是可以得到正确的数据,下面给出测试代码,大家可以直接在SQL查询分析器里运行

方法一:

SELECT  B.xname,
( SELECT  cf  FROM  成绩表  INNER   JOIN  课程表  ON  成绩表.ckno = 课程表.kno  WHERE  成绩表.cno = B.xno  AND  课程表.kname = ' 语文 '  )  AS  语文,
( SELECT  cf  FROM  成绩表  INNER   JOIN  课程表  ON  成绩表.ckno = 课程表.kno  WHERE  成绩表.cno = B.xno  AND  课程表.kname = ' 数学 '  )  AS  数学
FROM  学生表 B

 

方法二:

SELECT  xname,
MAX ( CASE  kname  WHEN   ' 语文 '   THEN  cf  ELSE   0   END AS  语文,
MAX ( CASE  kname  WHEN   ' 数学 '   THEN  cf  ELSE   0   END AS  数学
FROM  ( SELECT  B.xname,C.kname,D.cf  FROM  成绩表 D 
INNER   JOIN  学生表 B  ON  B.xno = D.cno 
INNER   JOIN  课程表 C  ON  C.kno = D.ckno)  AS  ZH  GROUP   BY  xname


DROP TABLE 学生表
DROP TABLE 课程表
DROP TABLE 成绩表

 

sql server多行数据合并显示


更多文章、技术交流、商务合作、联系博主

微信扫码或搜索:z360901061

微信扫一扫加我为好友

QQ号联系: 360901061

您的支持是博主写作最大的动力,如果您喜欢我的文章,感觉我的文章对您有帮助,请用微信扫描下面二维码支持博主2元、5元、10元、20元等您想捐的金额吧,狠狠点击下面给点支持吧,站长非常感激您!手机微信长按不能支付解决办法:请将微信支付二维码保存到相册,切换到微信,然后点击微信右上角扫一扫功能,选择支付二维码完成支付。

【本文对您有帮助就好】

您的支持是博主写作最大的动力,如果您喜欢我的文章,感觉我的文章对您有帮助,请用微信扫描上面二维码支持博主2元、5元、10元、自定义金额等您想捐的金额吧,站长会非常 感谢您的哦!!!

发表我的评论
最新评论 总共0条评论