美文网首页数据库专家
JavaEE,大数据-面试-Sql专题-3-行转列案例汇总

JavaEE,大数据-面试-Sql专题-3-行转列案例汇总

作者: 739c8d412b4c | 来源:发表于2018-11-17 11:30 被阅读201次

行转列,笔试中经常出现,主要就是case简单函数和case搜索函数的使用,下面给大家几个案例

案例1

数据

CREATE TABLE `t_score` (
  `id` int(10) NOT NULL AUTO_INCREMENT,
  `name` varchar(20) DEFAULT NULL,
  `course` varchar(20) DEFAULT NULL,
  `score` float DEFAULT '0',
  PRIMARY KEY (`ID`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;

insert into t_score(name, course, score)  values
("张三", "数学", 34),
("张三", "语文", 58),
("张三", "英语", 58),
("李四", "数学", 45),
("李四", "语文", 87),
("李四", "英语", 45),
("王五", "数学", 76),
("王五", "语文", 34),
("王五", "英语", 89);

数据效果

1. 行转列SQL 语法一:简单case函数

需要效果


sql语句

SELECT name 姓名,
    MAX(CASE course WHEN '数学' THEN score ELSE 0 END ) 数学,
    MAX(CASE course WHEN '语文' THEN score ELSE 0 END ) 语文,
    MAX(CASE course WHEN '英语' THEN score ELSE 0 END ) 英语
FROM t_score
GROUP BY name;

2. 行转列SQL 语法二:case搜索函数,这种语法后面可以带复杂逻辑,推荐使用

这个案例,还看不出case 搜索函数更强大的地方,只能看到另外一种写法

需要效果

sql语句

SELECT name 姓名,
    MAX(CASE  WHEN course='数学' THEN score ELSE 0 END ) 数学,
    MAX(CASE  WHEN course='语文' THEN score ELSE 0 END ) 语文,
    MAX(CASE  WHEN course='英语' THEN score ELSE 0 END ) 英语
FROM t_score
GROUP BY name;

3. 带总分和平均分

需要效果


sql语句

select name 姓名,
sum(case when course='语文' then score else 0 end )as 语文,
sum(case when course='数学' then score else 0 end )as 数学,
sum(case when course='英语' then score else 0 end )as 英语,
SUM(score)总分,ROUND(avg(score)) 平均分 from t_score
group by name order by 总分;

4. case when 带between and 函数

课程 不及格(0-59)个 良(60-80)个 优(81-100)个
需要效果


sql语句

     select course 科目,
     sum(case when score between 0 and 59 then 1 else 0 end) as 不及格,
     sum(case when score between 60 and 80 then 1 else 0 end) as 良,
     sum(case when score between 81 and 100 then 1 else 0 end) as 优秀 
     from t_score
     group by course;

案例2

数据准备

CREATE TABLE `t_ke` (
  `id` int(10) NOT NULL AUTO_INCREMENT comment '',
  `teacherno` varchar(20) DEFAULT NULL comment '教室号',
  `weekno` varchar(20) DEFAULT NULL comment '星期号',
  `hasscore` varchar(10) DEFAULT '0' comment '是否有课',
  PRIMARY KEY (`ID`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;

INSERT INTO `mianshi_5`.`t_ke` (`id`, `teacherno`, `weekno`, `hasscore`) VALUES (NULL, '1', '2', '有');
INSERT INTO `mianshi_5`.`t_ke` (`id`, `teacherno`, `weekno`, `hasscore`) VALUES (NULL, '1', '3', '有');
INSERT INTO `mianshi_5`.`t_ke` (`id`, `teacherno`, `weekno`, `hasscore`) VALUES (NULL, '2', '1', '有');
INSERT INTO `mianshi_5`.`t_ke` (`id`, `teacherno`, `weekno`, `hasscore`) VALUES (NULL, '3', '2', '有');
INSERT INTO `mianshi_5`.`t_ke` (`id`, `teacherno`, `weekno`, `hasscore`) VALUES (NULL, '1', '2', '有');
INSERT INTO `mianshi_5`.`t_ke` (`id`, `teacherno`, `weekno`, `hasscore`) VALUES (NULL, '2', '2', '无');

select * from t_ke;

数据查看

1. 一句sql,得到如下结果

需要效果


sql语句

SELECT teacherno 教师号 ,
    SUM(CASE  WHEN weekno='1' and hasscore='有' THEN 1 ELSE NULL END ) 星期一,
    SUM(CASE  WHEN weekno='2' and hasscore='有' THEN 1 ELSE NULL END ) 星期二,
    SUM(CASE  WHEN weekno='3' and hasscore='有' THEN 1 ELSE NULL END ) 星期三
FROM t_ke
GROUP BY teacherno; 

案例3(了解)

数据准备

DROP TABLE IF EXISTS `TabName`;
CREATE TABLE `TabName` (
  `Id` int(11) NOT NULL AUTO_INCREMENT,
  `Name` varchar(20) DEFAULT NULL,
  `Date` date DEFAULT NULL,
  `Scount` int(11) DEFAULT NULL,
  PRIMARY KEY (`Id`)
) ENGINE=InnoDB AUTO_INCREMENT=9 DEFAULT CHARSET=utf8;
 

INSERT INTO `TabName` VALUES ('1', '小说', '2013-09-01', '10000');
INSERT INTO `TabName` VALUES ('2', '微信', '2013-09-01', '20000');
INSERT INTO `TabName` VALUES ('3', '小说', '2013-09-02', '30000');
INSERT INTO `TabName` VALUES ('4', '微信', '2013-09-02', '35000');
INSERT INTO `TabName` VALUES ('5', '小说', '2013-09-03', '31000');
INSERT INTO `TabName` VALUES ('6', '微信', '2013-09-03', '36000');
INSERT INTO `TabName` VALUES ('7', '小说', '2013-09-04', '35000');
INSERT INTO `TabName` VALUES ('8', '微信', '2013-09-04', '38000');



SELECT  * from TabName ;

数据查看

1. group_concat的使用-1

效果


SELECT
    Date,
    group_concat(NAME, '总量:', Scount) AS b_str
FROM
    TabName
GROUP BY
    Date;

2. group_concat的使用-2

效果


SELECT
    Date,
    NAME,
    group_concat(NAME, '总量:', Scount) AS b_str
FROM
    TabName
GROUP BY
    Date,
    NAME

相关文章

  • JavaEE,大数据-面试-Sql专题-3-行转列案例汇总

    行转列,笔试中经常出现,主要就是case简单函数和case搜索函数的使用,下面给大家几个案例 案例1 数据 数据效...

  • SqlServer 行转列

    1 建表,添加测试数据 表数据如下图: 行转列sql 行转列如下图: 2 建表,添加测试数据 表数据如下: 行转列...

  • SQL Server行转列

    SQL行转列 经典实例 创建表格 SQL行转列 经典实例 创建表格 行转列 结果 参考链接

  • 数据库表行列转换

    行转列 创建表kecheng,并插入数据 查询该表,结构显示: 通过sql查询显示下图: SQL_A: SQL_B...

  • SQL行转列-列转行

    SQL行转列-列转行 一、行转列 建表语句 插入数据 查询数据表中的内容(即转换前的结果) 先来看一下转换后的结果...

  • Power Query 系列 (08) - 行转列案例

    行转列是一种常见的数据处理操作,所以对如何在 SQL 语句中、如何在 pandas 中实现这种行转列做过一些总结。...

  • sql行转列应用

    sql行转列应用 数据表实际存储格式原始表为了适应我们某个平台框架的使用(该框架直接配置sql,平台自动实现数据的...

  • SQL 行转列

    对于这样一个表: 查询出这样一个结果: 这是怎样一个原理呢?去掉这个SQL最后边的group by name,查询...

  • Sql 行转列

    实现效果 原始数据 转换后数据 示例代码

  • DLA SQL技巧:行、列转换和JSON数据列展开

    1. 简介 在数据库SQL处理中,常常有行转列(Pivot)和列转行(Unpivot)的数据处理需求。本文以示例说...

网友评论

    本文标题:JavaEE,大数据-面试-Sql专题-3-行转列案例汇总

    本文链接:https://www.haomeiwen.com/subject/rxpbfqtx.html