SQL面试题之行转列
典型的课程表:
mysql> select * from course;
+----+------------+----------+------------+
| id | teacher_id | week_day | has_course |
+----+------------+----------+------------+
| 1 | 1 | 2 | Yes |
| 2 | 1 | 3 | Yes |
| 3 | 2 | 1 | Yes |
| 4 | 3 | 2 | Yes |
| 5 | 1 | 2 | Yes |
+----+------------+----------+------------+
对于每个教师的每一天进行判断:
mysql> select teacher_id ,\
-> ( case week_day when '' then 'Yes' else '' end ) as 'mon',\
-> ( case week_day when '' then 'Yes' else '' end ) as 'tue',\
-> ( case week_day when '' then 'Yes' else '' end ) as 'thi',\
-> ( case week_day when '' then 'Yes' else '' end ) as 'thu',\
-> ( case week_day when '' then 'Yes' else '' end ) as 'fri'
-> from course\
-> ;
+------------+-----+-----+-----+-----+-----+
| teacher_id | mon | tue | thi | thu | fri |
+------------+-----+-----+-----+-----+-----+
| 1 | | Yes | | | |
| 1 | | | Yes | | |
| 2 | Yes | | | | |
| 3 | | Yes | | | |
| 1 | | Yes | | | |
+------------+-----+-----+-----+-----+-----+
这时候就能拿到每一条课程安排对于一周的影响(某一天有没有课)。
可以看到有重复数据,或者说数据比较分散,这时候可以用分组来将数据进行合并:
mysql> select teacher_id ,\
-> max( case week_day when '' then 'Yes' else '' end ) as 'mon',\
-> max( case week_day when '' then 'Yes' else '' end ) as 'tue',\
-> max( case week_day when '' then 'Yes' else '' end ) as 'thi',\
-> max( case week_day when '' then 'Yes' else '' end ) as 'thu',\
-> max( case week_day when '' then 'Yes' else '' end ) as 'fri'
-> from course\
-> group by teacher_id;
+------------+------+------+------+------+------+
| teacher_id | mon | tue | thi | thu | fri |
+------------+------+------+------+------+------+
| 1 | | Yes | Yes | | |
| 2 | Yes | | | | |
| 3 | | Yes | | | |
+------------+------+------+------+------+------+
要点:
不论是列转行还是行转列,转过去的目标肯定是被“造出来”的(case...when);
利用分组函数去重和合并。
SQL面试题之行转列的更多相关文章
- Sql server 中将数据行转列列转行(二)
老规矩,先弄一波测试数据,数据填充代码没有什么意义,先折叠起来: /* 第一步:创建临时表结构 */ CREATE TABLE #Student --创建临时表 ( StuName ), --学生名称 ...
- Oracle中用一条Sql实现任意的行转列拼接 多行拼接
表结构和数据如下(表名Test): NO VALUE NAME 1 a 测试1 1 b 测试2 1 c 测试3 1 d 测试4 2 e 测试5 4 f 测试6 4 g 测试7 Sql语句: selec ...
- Sql server 中将数据行转列列转行(一)
在做一些数据分析与数据展示时,经常会遇到行转列,列转行的需求,今天就来总结下: 在开始之前,先来创建一个临时表,并且写入一些测试数据: /* 第一步:创建临时表结构 */ CREATE TABLE # ...
- SQL SERVER pivot(行转列),unpivot(列转行)
[pivot]行转列:多行变一列 假设学生成绩表Score1 Name Subject Score 小张 语文 88 小花 数学 89 小张 数学 90 Name 语文 数学 小花 null 89 小 ...
- sql里的多行多列转一行多列小技巧
---恢复内容开始--- [ 今天下午接受了一个紧急小任务,是将一组比赛记录统计出来,将象棋游戏玩家的两条记录在一行里面显示,进数据库看之后是首先想到的是行转列,但是一开始就觉得不对,后来写到一半确实 ...
- 微软BI 之SSIS 系列 - 在 SQL 和 SSIS 中实现行转列的 PIVOT 透视操作
开篇介绍 记得笔者在 2006年左右刚开始学习 SQL Server 2000 的时候,遇到一个面试题就是行转列,列转行的操作,当时写了很长时间的 SQL 语句最终还是以失败而告终.后来即使能写出来, ...
- 【数据库】SQL经典面试题 - 行列转换二 - 列转行
本帖子是行转列的一个逆向操作——列转行,看下面一个面试题 面试题2: 柠檬班第30期学生要毕业了,他们的Linux.MySQL.Java成绩数据表 tb_lemon_grade_column中, 表中 ...
- 面试题:oracle数据库行转列的问题
今天我一个学弟问了一个面试题: 有表A,结构如下:A: p_ID p_Num s_id1 10 011 12 022 8 013 11 013 8 03其中:p_ID为产品ID,p_Num为产品库存量 ...
- SQL Server 动态行转列(参数化表名、分组列、行转列字段、字段值)
一.本文所涉及的内容(Contents) 本文所涉及的内容(Contents) 背景(Contexts) 实现代码(SQL Codes) 方法一:使用拼接SQL,静态列字段: 方法二:使用拼接SQL, ...
随机推荐
- centos7 sqoop 1 搭建笔记
1.require : java环境,hadoop,hive ,mysql2.下载解压sqoop13.设置环境变量 export SQOOP_HOME=/data/spark/bin/sqoop ex ...
- OSS 视频存储
我这里加了 封面图片 可以不理睬! 我没有存oss. 阿里的OSS 自己可以去官网下载 我这里放到 Vendor 下的. 1 # 注意这里OSS中 请设置 存储空间名称为公共的 才能直接使用这里返回的 ...
- java sigar.jar
http://blog.csdn.net/yin_jw/article/details/40151547 DEBUG Sigar - no libsigar-x86-linux.so in java. ...
- 更新源pip
国内镜像源列表 豆瓣(douban) http://pypi.douban.com/simple/清华大学 https://pypi.tuna.tsinghua.edu.cn/simple/阿里云 h ...
- 哪些优秀的 Windows 小工具,类似 clover 或 everything
有哪些优秀的 Windows 小工具,类似 clover 或 everything? 目前已知的有everything, listary, total commander, clover, dexpo ...
- 自定义消息的操作方法ON_MESSAGE(..)
- 实战--利用Lloyd算法进行酵母基因表达数据的聚类分析
背景:酵母会在一定的时期发生diauxic shift,有一些基因的表达上升,有一些基因表达被抑制,通过聚类算法,将基因表达的变化模式聚成6类. ORF Name R1.Ratio R2.Ratio ...
- hadoop两大核心之一:MapReduce总结
MapReduce是一种分布式计算模型,由Google提出,主要用于搜索领域,MapReduce程序 本质上是并行运行的,因此可以解决海量数据的计算问题. MapReduce任务过程被分为两个处理阶段 ...
- unigui作中间件使用
unigui作中间件使用 可返回string或者tstream数据. 如果返回JSON字符,则UNIGUI就是REST 中间件. procedure TUniServerModule.UniGUISe ...
- SQL Server 2008 表分区的含义
https://www.cnblogs.com/knowledgesea/p/3696912.html 继续看这个文档 http://www.360doc.com/content/16/0104/11 ...