Berlin_罗柏林
新手
新手
  • 最后登录2016-05-02
  • 发帖数4
阅读:10914回复:2

怎么让SQL查询结果改变显示方式

楼主#
更多 发布于:2016-01-18 09:13
把默认的显示方式进行改变,把原先的行变为列,原先的列变为行显示。
求解答:

最新喜欢:

狗哥爱爱萍狗哥爱爱萍
doubleyong
管理员
管理员
  • 最后登录2025-05-13
  • 发帖数1197
  • 最爱沙发
  • 喜欢达人
  • 原创写手
  • 社区居民
  • 忠实会员
沙发#
发布于:2016-01-18 21:42
SQL如何进行行转列,请参考以下方法:
学校里面记录成绩,每个人的选课不一样,而且以后会添加课程,所以不需要把所有课程当作列。数据库grade里面数据如下图,假定每个人姓名都不一样,作为主键。本文以MySQL为基础,其他数据库会有些许语法不同。
数据库数据:

处理后效果:

下面介绍三种方法:
方法一:
[code ]SELECTDISTINCT a.name,
(SELECTscoreFROMgrade bWHEREa.name=b.nameANDb.course='语文')AS'语文',
(SELECTscoreFROMgrade bWHEREa.name=b.nameANDb.course='数学')AS'数学',
(SELECTscoreFROMgrade bWHEREa.name=b.nameANDb.course='英语')AS'英语'
FROMgrade a[/code]

方法二:


[code ]SELECTname,
SUM(CASE courseWHEN '语文'THENscoreEND)AS'语文',
SUM(CASE courseWHEN '数学'THENscoreEND)AS'数学',
SUM(CASE courseWHEN '英语'THENscoreEND)AS'英语'
FROMgradeGROUPBYname[/code]

方法二还可以使用IF语句。
如下所示:

[code ]SELECT name,
SUM(IF (course = '语文' , score , null ) ) as '语文',
SUM(IF (course = '数学' , score , null ) ) as '数学',
SUM(IF (course = '英语' , score , null ) ) as '英语 '
FROM grade GROUP BY name[/code]

  • IF(expr1,expr2,expr3),如果expr1是TRUE(expr1<>0且expr1<>NULL),那么IF()返回expr2,否则它返回expr3。IF()返回一个数字或字符串值,取决于它被使用的上下文。
方法三:


[code ]DELIMITER &&
CREATE PROCEDURE sp_count()
BEGIN
#课程名称
DECLARE course_n VARCHAR(20);
#所有课程数量
DECLARE count INT;
#计数器
DECLARE i INT DEFAULT 0;
#拼接SQL字符串
SET @s = 'SELECT name';
SET count = (SELECT  COUNT(distinct course) FROM grade);
WHILE i &lt; count DO
SET course_n = (SELECT course FROM grade LIMIT i,1);
SET @s = CONCAT(@s, ', SUM(CASE  course WHEN  ','\'', course_n,'\'',' THEN score END )',' AS ','\'',course_n,'\'');
SET i = i+1;
END WHILE;
SET @s = CONCAT(@s, ' FROM grade GROUP BY name');
#用于调试
#SELECT @s;
PREPARE stmt FROM @s;
EXECUTE stmt;
END
&&
  
call sp_count();[/code]

方法分析:
第一种方法使用了表连接。
第二种使用了分组,对每个分组分别处理。

第三种使用了存储过程,其实是第二种方法的动态化,先计算出所有课程的数量,然后对每个分组进行课程查询。
很明显前两种方法属于硬编码,增加课程后就需要修改SQL。而第三种则没有这种问题。

Note:
MySQL中不能在一个存储过程中删除另一个存储过程,只能调用另一个存储过程
本来想在方法三里面写上:DROP PROCEDURE IF EXISTS sp_count();这是错误的。调试的时候如果写错了,只能手动删除了,也没找到好方法。


原文地址:http://my.oschina.net/boltwu/blog/508565
知识需要管理,知识需要分享
狗哥爱爱萍
侠客
侠客
  • 最后登录2016-12-14
  • 发帖数22
  • 社区居民
板凳#
发布于:2016-01-18 19:00
一楼!
刺瞎双眼去寻找你的背影
游客


返回顶部

公众号

公众号