SQL知识点之列转行Unpivot函数
前言
这是总结SQL知识点的第二篇文章,一次只总结一个知识点,尽量说明白。上次我们谈到行转列,用的是Pivot函数,这次我们来谈谈Unpivot函数。(这里是用的数据库是SQLSERVER,与其他数据库是类似的,大家放心看就好)
先看一个小问题CustomerCustomer
在这张图中,表示的是顾客用不同手机号给Phone1、Phone2、Phone3拨打电话的情况,但是机灵的你,想变个花样来看看,比如下面这样的。
UnpivotUnpivot
大家想想看如何实现呢?想下,2分钟后再看哟
先创建数据
CREATE TABLE dbo.CustomerPhones ( CustomerID INT PRIMARY KEY, -- FK Phone1 VARCHAR(32), Phone2 VARCHAR(32), Phone3 VARCHAR(32) ); INSERT dbo.CustomerPhones (CustomerID, Phone1, Phone2, Phone3) VALUES (1,'705-491-1111', '705-491-1110', NULL), (2,'613-492-2222', NULL, NULL), (3,'416-493-3333', '416-493-3330', '416-493-3339'); select * from dbo.CustomerPhones
查看数据如下:
DataDataUpivot 实现行转列
select * from dbo.CustomerPhones -----数据源 unpivot ( Phone FOR Phones IN (Phone1, Phone2, Phone3) ##Phone1、Phone2、Phone3这些列的结果转为行上的结果,成为一列, ##并且有了新的列名为Phone ) up
结果如下:
ResultResult
参考文献:
1.Use SQL Server's UNPIVOT operator to help normalize output
2.SQL之行转列Pivot用法
总结
以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,谢谢大家对我们的支持。
相关推荐
-
mssql 数据库表行转列,列转行终极方案
复制代码 代码如下: --行转列问题 --建立測試環境 Create Table TEST (DATES Varchar(6), EMPNO Varchar(5), STYPE Varchar(1), AMOUNT Int) --插入數據 Insert TEST Select '200605', '02436', 'A', 5 Union All Select '200605', '02436', 'B', 3 Union All Select '200605', '02436', 'C', 3
-
mysql 列转行的技巧(分享)
前言: 由于很多业务表因为历史原因或者性能原因,都使用了违反第一范式的设计模式.即同一个列中存储了多个属性值(具体结构见下表). 这种模式下,应用常常需要将这个列依据分隔符进行分割,并得到列转行的结果. 表数据: ID Value 1 tiny,small,big 2 small,medium 3 tiny,big 期望得到结果: ID Value 1 tiny 1 small 1 big 2 small 2 medium 3 tiny 3 big 正文: #需要处理的表 create tabl
-
mysql列转行以及年月分组实例
如下所示: SELECT count(DISTINCT(a.rect_id)) zcount, a.job_dept, DATE_FORMAT(submit_date, '%Y-%m') zsubmit_date FROM 表名 a WHERE a.statu = 3 AND a.rstatu = 2 AND a.job_dept IN ('19', '20', '21') GROUP BY a.job_dept, DATE_FORMAT(submit_date, '%Y-%
-
mysql 列转行,合并字段的方法(必看)
数据表: 列转行:利用max(case when then) max---聚合函数 取最大值 (case course when '语文' then score else 0 end) ---判断 as 语文---别名作为列名 SELECT `name`, MAX( CASE WHEN course='语文' THEN score END ) AS 语文, MAX( CASE WHEN course='数学' THEN score END ) AS 数学, MAX( CASE WHEN cour
-
mysql 行转列和列转行实例详解
mysql行转列.列转行 语句不难,不做多余解释了,看语句时,从内往外一句一句剖析 行转列 有如图所示的表,现在希望查询的结果将行转成列 建表语句如下: CREATE TABLE `TEST_TB_GRADE` ( `ID` int(10) NOT NULL AUTO_INCREMENT, `USER_NAME` varchar(20) DEFAULT NULL, `COURSE` varchar(20) DEFAULT NULL, `SCORE` float DEFAULT '0', PRIM
-
SQL行转列和列转行代码详解
行列互转,是一个经常遇到的需求.实现的方法,有case when方式和2005之后的内置pivot和unpivot方法来实现. 在读了技术内幕那一节后,虽说这些解决方案早就用过了,却没有系统性的认识和总结过.为了加深认识,再总结一次. 行列互转,可以分为静态互转,即事先就知道要处理多少行(列);动态互转,事先不知道处理多少行(列). --创建测试环境 USE tempdb; GO IF OBJECT_ID('dbo.Orders') IS NOT NULL DROP TABLE dbo.Orde
-
SQL行转列、列转行的简单实现
前言 行列转换在做报表分析时还是经常会遇到的,今天就说一下如何实现行列转换吧. 行列转换就是如下图所示两种展示形式的互相转换 行转列 假如我们有下表: SELECT * FROM student PIVOT ( SUM(score) FOR subject IN (语文, 数学, 英语) ) 通过上面 SQL 语句即可得到下面的结果 PIVOT 后跟一个聚合函数来拿到结果,FOR 后面跟的科目是我们要转换的列,这样的话科目中的语文.数学.英语就就被转换为列.IN 后面跟的就是具体的科目值. 当然
-
SQL知识点之列转行Unpivot函数
前言 这是总结SQL知识点的第二篇文章,一次只总结一个知识点,尽量说明白.上次我们谈到行转列,用的是Pivot函数,这次我们来谈谈Unpivot函数.(这里是用的数据库是SQLSERVER,与其他数据库是类似的,大家放心看就好) 先看一个小问题CustomerCustomer 在这张图中,表示的是顾客用不同手机号给Phone1.Phone2.Phone3拨打电话的情况,但是机灵的你,想变个花样来看看,比如下面这样的. UnpivotUnpivot 大家想想看如何实现呢?想下,2分钟后再看哟 先创
-
SQL行转列与列转行
1.数据集 +---+----------+ |id |login_date| +---+----------+ |01 |2021-02-28| |01 |2021-03-01| |01 |2021-03-02| |01 |2021-03-04| |01 |2021-03-05| |01 |2021-03-06| |01 |2021-03-08| |02 |2021-03-01| |02 |2021-03-02| |02 |2021-03-03| |02 |2021-03-06| |03 |2
-
SQL行转列与列转行详情
1.数据集 +---+----------+ |id |login_date| +---+----------+ |01 |2021-02-28| |01 |2021-03-01| |01 |2021-03-02| |01 |2021-03-04| |01 |2021-03-05| |01 |2021-03-06| |01 |2021-03-08| |02 |2021-03-01| |02 |2021-03-02| |02 |2021-03-03| |02 |2021-03-06| |03 |2
-
Oracle的数据表中行转列与列转行的操作实例讲解
行转列 一张表 查询结果为 --行转列 select years,(select amount from Tb_Amount as A where month=1 and A.years=Tb_Amount.years)as m1, (select amount from Tb_Amount as A where month=2 and A.years=Tb_Amount.years)as m2, (select amount from Tb_Amount as A where month=3
-
PostgreSQL 实现列转行问题
1 测试表数据 SELECT relative_label_content FROM frk_s.label_cor_gene relative_label_content ------ AA BB CC 2 列转行写法 写法1: string_agg SELECT frwybs, string_agg (relative_label_content, ',') as relative_label_content FROM frk_s.label_cor_gene GROUP BY frwybs
-
SQL Server 使用 Pivot 和 UnPivot 实现行列转换的问题小结
对于行列转换的数据,通常也就是在做报表的时候用的比较多,之前也零零散散的看了一些,今天就来总结一下. 先创建一个用于演示的临时表: create table #temp ( 年份 nvarchar(10) null, 月份 nvarchar(10) null, 数量 int null ) insert into #temp(年份,月份,数量) select '2015','1','5645' union select '2015','2','1234' union select '2015','
-
SQL Server使用PIVOT与unPIVOT实现行列转换
一.sql行转列:PIVOT 1.基本语法: create table #table1 ( id int ,code varchar(10) , name varchar(20) ); go insert into #table1 ( id,code, name ) values ( 1, 'm1','a' ), ( 2, 'm2',null ), ( 3, 'm3', 'c' ), ( 4, 'm2','d' ), ( 5, 'm1','c' ); go select * from #tabl
-
一文弄懂MYSQL如何列转行
目录 一.需求: 二.如何实现 1)首先看我们的静态SQL 2)那么就有人问了,如果我有100门课程不是要写100次名称,这也太麻烦了? 3)这样每次都写一长串sql也很麻烦? 总结 一.需求: 有三张表,学生表.成绩表和课程表,我们可以通过连表查询出学生姓名.课程及对应的成绩: 所需表sql -- ---------------------------- -- Table structure for student -- ---------------------------- DROP TA
随机推荐
- ajax readyState的五种状态详解
- jquery 插件开发 extjs中的extend用法小结
- jQuery解析返回的xml和json方法详解
- js分页工具实例
- Css3制作变形与动画效果
- 深入讲解Java编程中类的生命周期
- Python基于回溯法子集树模板解决数字组合问题实例
- JavaScript中的call和apply的用途以及区别
- js对象继承之原型链继承实例
- C#获取存储过程返回值和输出参数值的方法
- Python3中使用urllib的方法详解(header,代理,超时,认证,异常处理)
- 在Mysql上创建数据表实例代码
- js 中 document.createEvent的用法
- Linux启动新进程的几种方法及比较
- Jquery Easyui搜索框组件SearchBox使用详解(19)
- PowerShell中以管理员权限启动应用程序的方法
- SqlServer强制断开数据库已有连接的方法
- jQuery简单实现仿京东商城的左侧菜单效果代码
- jquery数据验证插件(自制,简单,练手)实例代码
- jquery实现页面常用的返回顶部效果