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, ...
随机推荐
- ACM-ICPC 2018 徐州赛区网络预赛 G Trace(逆向,两颗线段树写法)
https://nanti.jisuanke.com/t/31459 思路 凡是后面的轨迹对前面的轨迹有影响的,可以尝试从后往前扫 区间修改需要push_down,单点更新所以不需要push_up(用 ...
- UVa 11722 Joining with Friend (几何概率 + 分类讨论)
题意:某两个人 A,B 要在一个地点见面,然后 A 到地点的时间区间是 [t1, t2],B 到地点的时间区间是 [s1, s2],他们出现的在这两个区间的每个时刻概率是相同的,并且他们约定一个到了地 ...
- mysql高级
视图: 视图是一条select语句执行后返回的结果集 试图是对若干张基础表的引用 定义视图: 建议以v_开头 create view 试图名称 as select 语句 查看视图 show table ...
- kepware http接口 php
读取某变量的值(HttpRequest <?php $request = new HttpRequest(); $request->setUrl('http://127.0.0.1:393 ...
- java基础-day12
第01天 java面向对象 今日内容介绍 u 知识回顾 u static静态关键字 u 代码块 第1章 知识回顾 1.1 方法的回顾 1.1.1 案例代码一: package co ...
- poj 2192 Zipper
题目 刚开始本来觉得可以用队列来写,但是 例如 ta te teta,ta的t先出队列那就不行了,所以还得用dp dp[i][j] 表示A前i个字符与B前j个字符是否能构成C前i+j个字符 要使 dp ...
- 关于cmp函数参数中的&符号
关于cmp函数参数中的&符号 关于sort函数中的cmp函数有着不同的写法,以刚刚的整形元素比较为例 还有人是这么写的: bool cmp(const int &a, const in ...
- hdu 4975 最大流快版
http://acm.hdu.edu.cn/showproblem.php?pid=4975 给出每行每列的和,问是否存在这样的表格:每个小格放的数字只能是0--9. 直接用第八场最大流模板. #in ...
- android TextView 设置部分文字背景色和文字颜色
通过SpannableStringBuilder来实现,它就像html里边的元素改变指定文字的文字颜色或背景色 public class MainActivity extends Activity { ...
- shell 命令 grep -v
grep -v shell命令中,grep命令,是对文本行的搜索命令.grep -v就是反向文本行搜索. 当控制台输出很多时,有很多是我们不想看到的,就可以用到grep -v命令 举个栗子:ls -l ...