SQL 行转列查询的简易实现

开发中难免遇到一些非常灵活的设计,比如对SQL的行转列进行业务数据展现的.

最近在做系统设计的时候设计了一个公共对象的扩展表,然后需要实现不同业务对象的组合查询,因此借鉴了以前经典的学生科目成绩行转列的案例

在此自己做了修正,以供分享.

先晒图说效果

1、表的原始数据

 

2、转换后的数据


ok ,下面具体介绍如何实现

环境:mysql 5.5 

工具: SQLyogEnt

首先是创建的学生科目成绩表

CREATE TABLE `tb_subject` (
  `name` varchar(30) DEFAULT NULL,
  `Subject` varchar(30) DEFAULT NULL,
  `Result` varchar(30) DEFAULT NULL,
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `sex` int(11) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=9 DEFAULT CHARSET=utf8;


然后插入一点数据

insert  into `tb_subject`(`name`,`Subject`,`Result`,`id`,`sex`) values ('张三','语文','85',1,NULL),('张三','数学','95',2,NULL),('张三','物理','90',3,NULL),('李四','语文','65',4,NULL),('李四','数学','100',5,NULL),('李四','物理','87',6,NULL),('李四','作文','优',7,NULL),('张三','作文','差',8,NULL);


之后的效果如下:



行转列的几种方式:

之类我采用了两种方式,直接SQL语句,另一种是通过存储过程

第一种,采用纯的sql语句,不过这种相对比较呆板

SELECT DISTINCT  a.name,
(SELECT result FROM tb_Subject b WHERE a.name=b.name AND b.SUBJECT='语文' ) AS '语文',
(SELECT result FROM tb_Subject b WHERE a.name=b.name AND b.SUBJECT='数学' ) AS '数学',
(SELECT result FROM tb_Subject b WHERE a.name=b.name AND b.SUBJECT='物理' ) AS '物理',
(SELECT result FROM tb_Subject b WHERE a.name=b.name AND b.SUBJECT='作文' ) AS '作文'
FROM tb_Subject a

第二种采用了创建存储过程方式:


DELIMITER &&
CREATE PROCEDURE row_column()
BEGIN
#课程名称
DECLARE sub_name VARCHAR(20);
#所有课程数量
DECLARE COUNT INT;
#计数器
DECLARE i INT DEFAULT 0;
#拼接SQL字符串
SET @s = 'SELECT a.name';
SET COUNT = (SELECT  COUNT(DISTINCT SUBJECT) FROM tb_Subject);
WHILE i < COUNT DO
SET sub_name = (SELECT  DISTINCT SUBJECT FROM tb_Subject LIMIT i,1);
# SET @s = CONCAT(@s, ', CASE  SUBJECT WHEN  ','\'', sub_name,'\'',' THEN result END',' AS ','\'',sub_name,'\'');

SET @s = CONCAT(@s, ',(select result from tb_Subject b where a.name=b.name and b.SUBJECT=','\'', sub_name,'\'',') AS \'',sub_name,'\'');
#用于调试
# SELECT @s;
SET i = i+1;
END WHILE;
SET @s = CONCAT(@s, ' FROM tb_Subject a GROUP BY a.name');
#用于调试
#SELECT @s;
PREPARE st FROM @s;
EXECUTE st;
END
&& CALL row_column();


以上两种最终的执行效果一样,如下:



ok,暂且整理到这里吧,希望能帮到有需要的朋友.




  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

一起学开源

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值