SQL行列问题

日常工作中,为了让数据的可读性更强,经常会对数据格式进行转化操作。总结一下日常工作中遇到的关于行列操作问题。

单行拆分成多行

在这里插入图片描述

--创建测试数据
CREATE TABLE fwj.customer
(
id STRING,
name STRING,
mobiles STRING);INSERT INTO fwj.customer
SELECT '1','jim','139,177,158' FROM system.dual;-- 解法一,不建议选择
SELECT a.id,a.name,substr(a.mobiles,1,3) mobiles FROM fwj.customer a 
UNION ALL
SELECT a.id,a.name,substr(a.mobiles,5,3) mobiles FROM fwj.customer a 
UNION ALL
SELECT a.id,a.name,substr(a.mobiles,9,3) mobiles FROM fwj.customer a -- 解法二
SELECT b.id,a.mobiles,b.name FROM (
SELECT explode(split(t.mobiles,',')) mobiles FROM fwj.customer t )a ,  fwj.customer b;
-- 优化,但不行。explode 这类UDTF函数不支持和其他字段一块被select。
SELECT t.id,t.name,explode(split(t.mobiles,',')) mobiles FROM fwj.customer t -- 解法三,可以理解成在一次查询中 
-- 先生成了一个视图 mob 包含了行转列后的数据,之后从mob 中取出转换后的数据,
-- 其他字段仍旧从原表中取。
SELECT a.id,a.name,mob.mobile  
FROM fwj.customer a lateral view explode(split(a.mobiles,',')) mob AS mobile;

split(str,sep):
该函数的作用是拆分指定分隔符分割的字符串,返回一个列表。

SELECT split(a.mobiles,',') FROM  fwj.customer a;result:
["139","177","158"]

explode(arr):
该函数是一个表生成函数。输入一个列表参数,将列表中的每个值都转换为一行。

SELECT explode(plit(a.mobiles,',')) mobiles FROM  fwj.customer a;result:mobiles
139
177
158

行列互换

测试集

/*创建数据库测试表*/
CREATE TABLE [Scores]([ID] INT IDENTITY(1, 1)   PRIMARY KEY ,[Student] VARCHAR(20) ,[Subject] VARCHAR(30) ,[Score] FLOAT)/*插入数据库测试数据信息*/INSERT  INTO Scores( Student, Subject, Score )VALUES  ( 'test001', '语文', '90' )INSERT  INTO Scores( Student, Subject, Score )VALUES  ( 'test001', '英语', '85' )INSERT  INTO Scores( Student, Subject, Score )VALUES  ( 'text002', '语文', '90' )INSERT  INTO Scores( Student, Subject, Score )VALUES  ( 'text002', '英语', '80' )INSERT  INTO Scores( Student, Subject, Score )VALUES  ( 'test003', '语文', '95' )INSERT  INTO Scores( Student, Subject, Score )VALUES  ( 'test003', '英语', '85' )

1. case when …then else …end 用法,行列转换

SELECT  Student AS '姓名' ,MAX(CASE SubjectWHEN '语文' THEN ScoreELSE 0END) AS '语文' ,--如果这个行是“语文”,就选此行作为列MAX(CASE SubjectWHEN '英语' THEN ScoreELSE 0END) AS '英语'
FROM    ScoresGROUP BY StudentORDER BY Student

2. pivot(聚合函数(要转成列值的列名) for 要转换的列 in(目标列名)

SELECT  Student AS '姓名' ,AVG(语文) AS '语文' ,AVG(英语) AS '英语'
FROM Scores PIVOT( AVG(Score) FOR Subject IN ( 语文, 英语 ) )as NewScores
GROUP BY Student
ORDER BY Student ASC

拓展题

将上表转化为下表的格式
在这里插入图片描述
在这里插入图片描述

-- 解法一,实用性不如解法二,但可能图二无法满足,推荐使用解法二
select t1.item,t1.[time]as startdate,min(t2.[time])as endtime
from t1,t1 as t2
where t1.type='start'
and t1.type<>t2.type
and t2.[time]>t1.[time]
group by t1.item,t1.[time]-- 解法二
Select  * From T1;
With S1 As (Select SeqNo, Item,Type,IIf(Type='Start', Time,Null) sTime,IIf(Type='End', Time,Null) eTime, Lag(Type,1,'0') Over (Partition By Item Order By Time) LastType  From T1 ),S2 As ( Select SeqNo,Item,Type,sTime,eTime,LastType,Sum(IIF(Type='Start',1,IIF(Type='End' And LastType='Start',0,1)))Over (Partition By Item Order By SeqNo) Gn  From S1 )
Select Item,Gn,Max(sTime) sTime,Max(eTime) eTime  From S2 Group By Item,Gn

解法二计算过程:
1.Time 的类型 设置为 Time(0)
2.S2代码思路:累加 分组 编号 …,避免万一 中间 没有(漏掉了) Start 记录, 却有 End 记录 的情况。如果是 Start 直接加1 ,如果是End 看下 前面是不是 Start ,是 就不加了,如果是第1条记录, 还是加 1。
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/474838.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

LeetCode 296. 最佳的碰头地点(坐标独立+中位数的地方最近)

文章目录1. 题目2. 解题1. 题目 有一队人&#xff08;两人或以上&#xff09;想要在一个地方碰面&#xff0c;他们希望能够最小化他们的总行走距离。 给你一个 2D 网格&#xff0c;其中各个格子内的值要么是 0&#xff0c;要么是 1。 1 表示某个人的家所处的位置。这里&…

laravel 判断字符串包含_laravel 字符串操作大全

我们在使用laravel的时候常常会遇到一些字符串的操作&#xff0c;下面就为大家介绍laravel常用字符串的操作函数&#xff1a;// 将 UTF-8 的值直译为 ASCII 类型的值Str::ascii($value)Str::camel($value)Str::contains($haystack, $needle)Str::endsWith($haystack, $needles)…

LeetCode 360. 有序转化数组(抛物线对称轴)

文章目录1. 题目2. 解题1. 题目 给你一个已经 排好序 的整数数组 nums 和整数 a、b、c。对于数组中的每一个数 x&#xff0c;计算函数值 f(x) ax^2 bx c&#xff0c;请将函数值产生的数组返回。 要注意&#xff0c;返回的这个数组必须按照 升序排列&#xff0c;并且我们所…

vue webpack打包入口文件是哪个_Vue 学习笔记(二十五):webpack 相关

Webpack 是什么Vue CLI Webpack 相关 Webpack更多参考官方文档Webpack 是一个前端资源加载/打包工具。它将根据模块的依赖关系进行静态分析&#xff0c;然后将这些模块按照指定的规则生成对应的静态资源。 如图&#xff0c;Webpack 可以将多种静态资源 js、css、less 转换成一个…

美团差评数据分析,python代码实现

文章目录明确问题理解数据处理数据异常值处理标签处理新增计算列数据分析分析思路描述性分析探索性分析送达总时长时间过长&#xff0c;导致的差评骑手个人行为导致的差评商户行为导致的差评其他评价标签的白描建议明确问题 美团骑手出现差评的原因是什么&#xff1f;影响因素…

[原创]FineUI秘密花园(二十一) — 表格之动态创建列

有时我们需要根据数据来动态创建表格列&#xff0c;怎么来做到这一点呢&#xff1f;本章会详细讲解。 动态创建的列 还是通过一个示例来看下如何在FineUI中动态创建表格列&#xff0c;示例的界面截图&#xff1a; 先来看下ASPX的标签定义&#xff1a; 1: <ext:Grid ID"…

[Hands On ML] 8. 降维

文章目录1. 降维方法1.1 投影1.2 流行学习2. 降维技术2.1 PCA2.2 增量PCA2.3 随机PCA2.4 核PCA2.5. 调参2.6 LLE2.7 其他方法本文为《机器学习实战&#xff1a;基于Scikit-Learn和TensorFlow》的读书笔记。 中文翻译参考 特征维度太大&#xff0c;降维加速训练能筛掉一些噪声和…

ios13全选手势_iOS13系统5个简单实用的技巧 快速选择/三指操作/批量删除短信/文字转表情...

iOS 13 已经发布一段时间&#xff0c;苹果带来了不少新内容和细节上的优化&#xff0c;一起来看看 iOS 13 还有哪些隐藏的小技巧&#xff0c;希望对大家有所帮助。iOS13系统5个简单实用的技巧&#xff1a;快速选择文本当您在编辑文本时&#xff0c;光标是闪动的状态&#xff0c…

一文搞懂lookup、vlookup、hlookup函数与index、match函数的使用

lookup 函数解析 当需要查询一行或一列并查找另一行或列中的相同位置的值时&#xff0c;会使用其中一个查找和引用函数LOOKUP。 使用方式 向量形式 在一行或一列中搜索值。 如果要指定包含要匹配的值的区域&#xff0c;请使用这种形式。 例如&#xff0c;如果要在 A 列中向…

亿塞通问题

亿塞通问题 文件无加密锁图标 1、32位系统&#xff1a;运行中&#xff0c;执行regsvr32 "C:\Program Files\ESAFENET\Cobra DocGuard Client\CDGMenu.dll" 2、64位系统&#xff1a;运行中&#xff0c;执行regsvr32 "C:\Program Files\ESAFENET\Cobra DocGuard C…

LeetCode 776. 拆分二叉搜索树(DFS)*

文章目录1. 题目2. 解题1. 题目 给你一棵二叉搜索树&#xff08;BST&#xff09;、它的根结点 root 以及目标值 V。 请将该树按要求拆分为两个子树&#xff1a;其中一个子树结点的值都必须小于等于给定的目标值 V&#xff1b;另一个子树结点的值都必须大于目标值 V&#xff1…

变压器绕组降低邻近效应_了解高频变压器设计基础(2)

单片开关电源高频变压器的设计要点高频变压器是单片开关电源的核心部件&#xff0c;鉴于这种高频变压器在设计上有其特殊性&#xff0c;为此专门阐述降低其损耗及抑制音频噪声的方法&#xff0c;可供高频变压器设计人员参考。单片开关电源集成电路具有高集成度、高性价比、最简…

js在类的方法中访问自己的属性

在类的方法中访问自己的属性&#xff0c;Javascript对于公有属性和私有属性的访问方法有所不同&#xff0c;请大家看下面的代码functionShape(ax,ay){varx0;vary0;this.gx0;this.gy0;varinit function(){xax;//访问私有属性&#xff0c;直接写变量名即可yay;this.gxax;//访问公…

Python-jieba分词学习及应用

文章目录基础添加自定义词典实战基础 jieba.cut 方法接受三个输入参数: 需要分词的字符串&#xff1b;cut_all 参数用来控制是否采用全模式&#xff1b;HMM 参数用来控制是否使用 HMM 模型jieba.cut_for_search 方法接受两个参数&#xff1a;需要分词的字符串&#xff1b;是否…

LeetCode 302. 包含全部黑色像素的最小矩形(BFS)

文章目录1. 题目2. 解题1. 题目 图片在计算机处理中往往是使用二维矩阵来表示的。 假设&#xff0c;这里我们用的是一张黑白的图片&#xff0c;那么 0 代表白色像素&#xff0c;1 代表黑色像素。 其中黑色的像素他们相互连接&#xff0c;也就是说&#xff0c;图片中只会有一…

蓝色三角_叶子长得像韭菜,花朵开得像个糖三角的鸢尾,用这3个方法拍摄它...

女孩子们小时候都跳皮筋。有一段口诀&#xff0c;里面有一句“马兰开花二十一”……我虽然皮筋没少跳&#xff0c;但是对于马兰花&#xff0c;却也是只闻其名&#xff0c;未见其身。后来&#xff0c;我在户外拍风光、拍花卉。在草丛里看到三片细长花瓣组成的的蓝色小花&#xf…

javascript获取浏览器客户端IP

<script language"JavaScript"> function GetLocalIPAddr(){ var oSetting null; var ip null; try{ oSetting new ActiveXObject( "rcbdyctl.Setting" ); ip oSetting.GetIPAddress; alert(ip); if (ip.length 0){ return "没有连接到Int…

Excel常用函数总结

常用函数 数学和三角函数 计算公式 SIGN–返回数字符号 当数字大于0时返回1&#xff0c;等于0返回0&#xff0c;小于0返回-1 ABS–计算数字的绝对值 SUM–计算数字之和 PRODUCT–计算数字之积 MOD–返回商的余数 QUOTIENT–返回商的整数部分 SUMIF–按给定条件对指定单元格求…

LeetCode 1063. 有效子数组的数目(单调栈)

文章目录1. 题目2. 解题1. 题目 给定一个整数数组 A&#xff0c;返回满足下面条件的 非空、连续 子数组的数目&#xff1a; 子数组中&#xff0c;最左侧的元素不大于其他元素。 示例 1&#xff1a; 输入&#xff1a;[1,4,2,5,3] 输出&#xff1a;11 解释&#xff1a;有 11 个…

springboot 多了8小时_日本人不明白:中国的奶茶有多好喝,值得排队8小时去买?...

日本人不明白&#xff1a;中国的奶茶有多好喝&#xff0c;值得排队8小时去买&#xff1f;最近有许多的网红奶茶店兴起&#xff0c;尤其是在冬季&#xff0c;加料十足的热奶茶就成为了年轻人的心头之好&#xff0c;就拿最近在武汉新开的首家茶颜悦色来说&#xff0c;每天的队伍都…