说完Pivot 今天说下Unpivot 的处理方式
上次说到,既然有Pivot 的行转列,那么肯定也有Unpivot 的列转行 。其实unpivot 处理的情况也是差不多,也是分3步走。
首先也是先演示一下unpivot 的用法
CREATE TABLE #Emp (Name NVARCHAR(50),Mon TIME,Tue TIME,Wed TIME,Thu TIME) INSERT INTO #Emp
( Name, Mon, Tue, Wed, Thu )
VALUES ( N'Ken', '8:30', '8:45','9:05','8:55' ),
( N'Joan', '8:25', '8:35', NULL,'9:00' ),
( N'Jack', '8:15', '9:03','9:05','8:38' ),
( N'Bob', '9:30', '8:53','9:01','8:56' ) SELECT * FROM #Emp Name Mon Tue Wed Thu
-------------------------------------------------- ---------------- ---------------- ---------------- ----------------
Ken 08:30:00.0000000 08:45:00.0000000 09:05:00.0000000 08:55:00.0000000
Joan 08:25:00.0000000 08:35:00.0000000 NULL 09:00:00.0000000
Jack 08:15:00.0000000 09:03:00.0000000 09:05:00.0000000 08:38:00.0000000
Bob 09:30:00.0000000 08:53:00.0000000 09:01:00.0000000 08:56:00.0000000
SELECT *
FROM #Emp UNPIVOT( [LoginTime] FOR [WeekDay] IN (Mon,Tue,Wed,Thu)) a Name LoginTime WeekDay
-------------------------------------------------- ---------------- --------------------------------------------------------------------------------------------------------------------------------
Ken 08:30:00.0000000 Mon
Ken 08:45:00.0000000 Tue
Ken 09:05:00.0000000 Wed
Ken 08:55:00.0000000 Thu
Joan 08:25:00.0000000 Mon
Joan 08:35:00.0000000 Tue
Joan 09:00:00.0000000 Thu
Jack 08:15:00.0000000 Mon
Jack 09:03:00.0000000 Tue
Jack 09:05:00.0000000 Wed
Jack 08:38:00.0000000 Thu
Bob 09:30:00.0000000 Mon
Bob 08:53:00.0000000 Tue
Bob 09:01:00.0000000 Wed
Bob 08:56:00.0000000 Thu
解释一下,
UNPIVOT( [LoginTime] FOR [WeekDay] IN (Mon,Tue,Wed,Thu)) 里面 。 WeekDay 是 根据 (Mon,Tue,Wed,Thu) 这4个列聚合起来的新列的名称,而 LoginTime 呢,就是存放 (Mon,Tue,Wed,Thu) 这几个列下面的值的新列名称。用起来还是挺方便的。
然后下面我要讲一下unpivot 的3步新路里程
1、赋值元素。首先是会按照 (Mon,Tue,Wed,Thu ) 4个列进行一个行赋值。生成第一步的虚拟表。就像下面一样
SELECT *
FROM #Emp a
FULL JOIN (SELECT 'Mon' AS [WeekDay]
UNION ALL
SELECT 'Tue' AS [WeekDay]
UNION ALL
SELECT 'Wed' AS [WeekDay]
UNION ALL
SELECT 'Thu' AS [WeekDay])b ON 1 = 1 得出中间表
Name Mon Tue Wed Thu WeekDay
-------------------------------------------------- ---------------- ---------------- ---------------- ---------------- -------
Bob 09:30:00.0000000 08:53:00.0000000 09:01:00.0000000 08:56:00.0000000 Mon
Bob 09:30:00.0000000 08:53:00.0000000 09:01:00.0000000 08:56:00.0000000 Tue
Bob 09:30:00.0000000 08:53:00.0000000 09:01:00.0000000 08:56:00.0000000 Wed
Bob 09:30:00.0000000 08:53:00.0000000 09:01:00.0000000 08:56:00.0000000 Thu
Jack 08:15:00.0000000 09:03:00.0000000 09:05:00.0000000 08:38:00.0000000 Thu
Jack 08:15:00.0000000 09:03:00.0000000 09:05:00.0000000 08:38:00.0000000 Wed
Jack 08:15:00.0000000 09:03:00.0000000 09:05:00.0000000 08:38:00.0000000 Tue
Jack 08:15:00.0000000 09:03:00.0000000 09:05:00.0000000 08:38:00.0000000 Mon
Joan 08:25:00.0000000 08:35:00.0000000 NULL 09:00:00.0000000 Tue
Joan 08:25:00.0000000 08:35:00.0000000 NULL 09:00:00.0000000 Mon
Joan 08:25:00.0000000 08:35:00.0000000 NULL 09:00:00.0000000 Wed
Joan 08:25:00.0000000 08:35:00.0000000 NULL 09:00:00.0000000 Thu
Ken 08:30:00.0000000 08:45:00.0000000 09:05:00.0000000 08:55:00.0000000 Thu
Ken 08:30:00.0000000 08:45:00.0000000 09:05:00.0000000 08:55:00.0000000 Mon
Ken 08:30:00.0000000 08:45:00.0000000 09:05:00.0000000 08:55:00.0000000 Tue
Ken 08:30:00.0000000 08:45:00.0000000 09:05:00.0000000 08:55:00.0000000 Wed
2 提取有效元素。结果类似下面语句生成的结果
;WITH CTE AS(
SELECT *
FROM #Emp a
FULL JOIN (SELECT 'Mon' AS [WeekDay]
UNION ALL
SELECT 'Tue' AS [WeekDay]
UNION ALL
SELECT 'Wed' AS [WeekDay]
UNION ALL
SELECT 'Thu' AS [WeekDay])b ON 1 = 1)
SELECT Name,[WeekDay],
CASE [WeekDay] WHEN 'Mon' THEN Mon
WHEN 'Tue' THEN Tue
WHEN 'Wed' THEN Wed
WHEN 'Thu' THEN Thu ELSE NULL END AS LoginTime
FROM CTE Name WeekDay LoginTime
-------------------------------------------------- ------- ----------------
Ken Mon 08:30:00.0000000
Joan Mon 08:25:00.0000000
Jack Mon 08:15:00.0000000
Bob Mon 09:30:00.0000000
Ken Tue 08:45:00.0000000
Joan Tue 08:35:00.0000000
Jack Tue 09:03:00.0000000
Bob Tue 08:53:00.0000000
Ken Wed 09:05:00.0000000
Joan Wed NULL
Jack Wed 09:05:00.0000000
Bob Wed 09:01:00.0000000
Ken Thu 08:55:00.0000000
Joan Thu 09:00:00.0000000
Jack Thu 08:38:00.0000000
Bob Thu 08:56:00.0000000
3 将Null值元素去除。这个好理解了,中间有Null值的行去除
;WITH CTE AS(
SELECT *
FROM #Emp a
FULL JOIN (SELECT 'Mon' AS [WeekDay]
UNION ALL
SELECT 'Tue' AS [WeekDay]
UNION ALL
SELECT 'Wed' AS [WeekDay]
UNION ALL
SELECT 'Thu' AS [WeekDay])b ON 1 = 1),
CTE2 AS (SELECT Name,[WeekDay],
CASE [WeekDay] WHEN 'Mon' THEN Mon
WHEN 'Tue' THEN Tue
WHEN 'Wed' THEN Wed
WHEN 'Thu' THEN Thu ELSE NULL END AS LoginTime
FROM CTE )
SELECT *
FROM CTE2
WHERE CTE2.LoginTime IS NOT NULL Name WeekDay LoginTime
-------------------------------------------------- ------- ----------------
Ken Mon 08:30:00.0000000
Joan Mon 08:25:00.0000000
Jack Mon 08:15:00.0000000
Bob Mon 09:30:00.0000000
Ken Tue 08:45:00.0000000
Joan Tue 08:35:00.0000000
Jack Tue 09:03:00.0000000
Bob Tue 08:53:00.0000000
Ken Wed 09:05:00.0000000
Jack Wed 09:05:00.0000000
Bob Wed 09:01:00.0000000
Ken Thu 08:55:00.0000000
Joan Thu 09:00:00.0000000
Jack Thu 08:38:00.0000000
Bob Thu 08:56:00.0000000
好!然后结果有没有和直接Unpivot 一样呢~揍是一样啦~当然罗~中间语句可能不是我演示的那样,我主要是演示中间的虚拟表~
好!周四了~再坚持一天~就又可以星期六上班班啦!
说完Pivot 今天说下Unpivot 的处理方式的更多相关文章
- @DisallowConcurrentExecution 注解的作用 【定时器执行完当前任务才开启下一个线程的方式】
转: @DisallowConcurrentExecution 注解的作用 2018年10月12日 16:42:40 fly_captain 阅读数:4317 Quartz定时任务默认都是并发执行 ...
- PIVOT(透视转换)和UNPIVOT(逆透视转换)
一.原数据状态 二.手动写透视转换1 三.手动写透视转换2 四.PIVOT(透视转换)和UNPIVOT(逆透视转换)详细使用 使用标准SQL进行透视转换和逆视转换 --行列转换 create tabl ...
- sql的行转列(PIVOT)与列转行(UNPIVOT) webapi 跨域问题 Dapper 链式查询 扩展 T4 代码生成 Demo (抽奖程序)
sql的行转列(PIVOT)与列转行(UNPIVOT) 在做数据统计的时候,行转列,列转行是经常碰到的问题.case when方式太麻烦了,而且可扩展性不强,可以使用 PIVOT,UNPIVOT比 ...
- linux下tomcat配置APR方式HTTPS
一.安装APR 创建/usr/local/apr tar zxvf apr-1.4.5.tar.gz cd apr-1.4.5 ./configure --prefix=/usr/local/apr/ ...
- IIS下的身份验证方式管理
设置.查看身份验证方式 #导航到某站点下: cd IIS:\Sites\DemoSite\DemoApp #启用站点test01下的Windows身份验证 Set-WebConfigurationPr ...
- Linux/centos/redhat下各种压缩解压缩方式详解
1.zip命令 zip -r myfile.zip ./* 将当前目录下的所有文件和文件夹全部压缩成myfile.zip文件,-r表示递归压缩子目录下所有文件. 2.unzip unzip -o -d ...
- AndroidUI组件之ActionBar--基于下拉的导航方式
在上一篇关于ActionBar的博文中.我们知道了ActionBar是Android3.0的重要更新之中的一个.本篇博文就来写一个开发中经经常使用到的样例.用ActionBar提供基于下拉的导航方 ...
- Linux 和 Windows 下实现多进程的方式以及管道操作
一.多进程 1.windows 多进程 使用 #include<windows.h> 下面的 BOOL CreateProcess( LPCWSTR pszImageName, LPCWS ...
- ipv6下jdbc的连接数据库方式
ipv6下jdbc的连接数据库方式 MySQL: ipv4 Driver URL: jdbc:mysql://127.0.0.1:3306/database ipv6 Driv ...
随机推荐
- freemarker:简介
Apache FreeMarker模板引擎:Java库来生成文本输出(HTML网页,电子邮件,配置文件,源代码,等等)基于模板和变化的数据.模板都写在FreeMarker模板语言(FTL),这是一个简 ...
- WordPress For SAE 移植
因应用商店中的自带的wordpress版本太旧,有需要用到官网上下载的最新版的,就要考虑移植了. 第一步 配置文件 网站根目录下,修改wp-config.php 数据库连接配置 第二步 附件/图片无法 ...
- Nginx负载均衡配置实例详解
负载均衡是我们大流量网站要做的一个东西,下面我来给大家介绍在Nginx服务器上进行负载均衡配置方法,希望对有需要的同学有所帮助哦. 负载均衡 先来简单了解一下什么是负载均衡,单从字面上的意思来理解就可 ...
- java注释规范
前言: 现在java的出产地sun公司并没有定义一个java注释规范,注释规范目前是每个公司自己有自己的一套规范,主要是为了团队之间的协作. 1.基本规则 1.注释应该使代码更加清 ...
- Python实现装饰模式的一段代码
# 实现装饰模式的一段代码 import functools def log(func): @functools.wraps(func) def wrapper(*args,**kw): print( ...
- EasyDropDown – 很棒的下拉菜单,含精美主题
EasyDropDown 是一个 jQuery 插件,你可以毫不费力地将简陋的 Select 元素设置为可定制风格的下拉菜单,用于表单或者一般的导航.和著名的下拉插件 Chosen 很像,但是具有自己 ...
- ShareDrop – 苹果 AirDrop 服务的 HTML5 实现
ShareDrop 是苹果 AirDrop 服务的 HTML5 版本,你可以直接在设备之间传输文件,而无需先上传到任何服务器.它使用 WebRTC 来实现安全的点对点文件传输.目前 ShareDrop ...
- word开发遇到的问题
1.系统不能安装多个office word版本,建议只安装一个2003版本,越完整越好. 2.安装时候ghost系统会遇到问题,由于很多组件没有完整的安装,因此缺少了很多安装时文件保护要进行提醒的dl ...
- URL 路径长度限制(错误:指定的文件或文件夹名称太长)
本节讨论 URL 的构成.SharePoint 2010 构建 URL 的方式.URL 的编码和加长以及作为其他 URL 中的参数传递的方式. SharePoint URL 的构成 SharePoin ...
- 【Leafletjs】5.L.Control 自定义一个Control
L.Control 所有leaflet控制的基础类.继承自IControl接口. 你可以这样添加控件: control.addTo(map); // the same as map.addContro ...