SQL查询语句行转列横向显示

sql 同时被 2 个专栏收录
2 篇文章 0 订阅
2 篇文章 0 订阅

转载自:
http://blog.163.com/dreamman_yx/blog/static/26526894201121595846270/

示例一、

表数据:
表数据
查询结果:
结果
方法一:

SELECT 
    t.name, 
    (SELECT SUM(h.amount) FROM test2 h WHERE h.mold = 'm1' AND h.name = t.name) m1,
    (SELECT SUM(h.amount) FROM test2 h WHERE h.mold = 'm2' AND h.name = t.name) m2,
    (SELECT SUM(h.amount) FROM test2 h WHERE h.mold = 'm3' AND h.name = t.name) m3
FROM test2 t 
GROUP BY t.name

方法二:

SELECT 
    t.name, 
    SUM(CASE WHEN t.mold='m1' THEN t.amount END) m1,
    SUM(CASE WHEN t.mold='m2' THEN t.amount END) m2,
    SUM(CASE WHEN t.mold='m3' THEN t.amount END) m3
FROM test2 t
GROUP BY t.name

实例二、

表数据:
表数据
查询结果:
查询结果

-- 静态SQL,指课程只有语文、数学、英语这三门课程。

方法一:

SELECT 
    t.name,
    MAX(CASE t.course WHEN '语文' THEN t.score ELSE 0 END) yw,
    MAX(CASE t.course WHEN '数学' THEN t.score ELSE 0 END) sx,
    MAX(CASE t.course WHEN '英语' THEN t.score ELSE 0 END) yy
FROM test3 t
GROUP BY t.name

方法二:

SELECT 
    t.name,
    SUM(IF(course = '语文', score, 0)) yw,
    SUM(IF(course = '数学', score, 0))  sx,
    SUM(IF(course = '英语', score, 0))  yy
FROM test3 t
GROUP BY t.name

建表语句及数据:

CREATE TABLE `test2` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `name` varchar(32) DEFAULT NULL COMMENT '名字',
  `mold` varchar(32) DEFAULT NULL COMMENT '类型',
  `amount` int(11) DEFAULT NULL COMMENT '数量',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=9 DEFAULT CHARSET=utf8;

insert into `test2` (`id`, `name`, `mold`, `amount`) values('1','小白','m1','1');
insert into `test2` (`id`, `name`, `mold`, `amount`) values('2','小白','m2','2');
insert into `test2` (`id`, `name`, `mold`, `amount`) values('3','小白','m3','3');
insert into `test2` (`id`, `name`, `mold`, `amount`) values('4','小黑','m1','4');
insert into `test2` (`id`, `name`, `mold`, `amount`) values('5','小黑','m2','5');
insert into `test2` (`id`, `name`, `mold`, `amount`) values('6','小白','m1','6');
insert into `test2` (`id`, `name`, `mold`, `amount`) values('7','小白','m3','7');
insert into `test2` (`id`, `name`, `mold`, `amount`) values('8','小黑','m3','1');
CREATE TABLE `test3` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `name` varchar(32) DEFAULT NULL COMMENT '姓名',
  `course` varchar(32) DEFAULT NULL COMMENT '课程',
  `score` int(11) DEFAULT NULL COMMENT '成绩',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

insert into `test3` (`id`, `name`, `course`, `score`) values('1','小白','语文','99');
insert into `test3` (`id`, `name`, `course`, `score`) values('2','小白','数学','88');
insert into `test3` (`id`, `name`, `course`, `score`) values('3','小白','英语','84');
insert into `test3` (`id`, `name`, `course`, `score`) values('4','小黑','语文','89');
insert into `test3` (`id`, `name`, `course`, `score`) values('5','小黑','数学','95');
insert into `test3` (`id`, `name`, `course`, `score`) values('6','小黑','英语','98');
  • 1
    点赞
  • 0
    评论
  • 4
    收藏
  • 扫一扫,分享海报

©️2022 CSDN 皮肤主题:终极编程指南 设计师:CSDN官方博客 返回首页
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值