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 表示某个人的家所处的位置。这里&…

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;降维加速训练能筛掉一些噪声和…

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

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

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

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

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…

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;每天的队伍都…

将整个表单设置为只读_如何将独立网站设置为制作中,阻止搜索引擎收录网站页面?...

独立网站设置为制作中当网站未完成状态时&#xff0c;可能不希望除管理员以外的人看到未完成的页面时&#xff0c;如何操作可以将独立网站设置为制作中&#xff0c;并阻止搜索引擎收录网站页面呢&#xff1f;可按照以下步骤进行操作&#xff1b;将网站设置为制作中网站制作中设…

LeetCode 361. 轰炸敌人(前缀和DP)

文章目录1. 题目2. 解题1. 题目 想象一下炸弹人游戏&#xff0c;在你面前有一个二维的网格来表示地图&#xff0c;网格中的格子分别被以下三种符号占据&#xff1a; W 表示一堵墙 E 表示一个敌人 0&#xff08;数字 0&#xff09;表示一个空位请你计算一个炸弹最多能炸多少敌…

led拼接屏报价_液晶拼接屏与led显示屏的区别在哪?

在目前的大屏显示产品中&#xff0c;液晶拼接屏和led显示屏是两种比较普遍的产品&#xff0c;拼接大屏是通过单个液晶拼接单元拼接而成的显示大屏&#xff0c;而led显示屏则是通过发光二极管组成密集点阵组成图像显示&#xff0c;我们通常听到的P1、P2代表的是像素点距离&#…

LeetCode 356. 直线镜像

文章目录1. 题目2. 解题1. 题目 在一个二维平面空间中&#xff0c;给你 n 个点的坐标。 问&#xff0c;是否能找出一条平行于 y 轴的直线&#xff0c;让这些点关于这条直线成镜像排布&#xff1f; 示例 1&#xff1a; 输入: [[1,1],[-1,1]] 输出: true示例 2&#xff1a; 输入…

使用DispatcherTimer计时器

《银光志--Silverlight 3.0开发详解与最佳实践》第3章XAML与Silverlight编程内功&#xff0c;通过本章的学习&#xff0c;相信你会对Silverlight编程模型、XAML、事件处理&#xff0c;以及LINQ查询语言有了一个比较全面的了解&#xff0c;在本章的示例中应用的都是一些基本的XA…

静物摄影用光技巧_室内人像摄影想要拍好,这3种用光技巧你了解吗?

选择靠近窗户的位置在室内可以首先考虑在靠近窗户的位置进行拍摄&#xff0c;因为窗户边上尤其是朝北的窗户会有非常柔和的散射光&#xff0c;当投射进窗户的是直射光线时&#xff0c;摄影者还可以拉上一层很薄的窗帘来缓解一下光线的强度&#xff0c;在靠近窗户的位置&#xf…

LeetCode 660. 移除 9(9进制)

文章目录1. 题目2. 解题1. 题目 从 1 开始&#xff0c;移除所有包含数字 9 的所有整数&#xff0c;例如 9&#xff0c;19&#xff0c;29&#xff0c;…… 这样就获得了一个新的整数数列&#xff1a;1&#xff0c;2&#xff0c;3&#xff0c;4&#xff0c;5&#xff0c;6&…