上次说到,既然有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 的处理方式的更多相关文章

  1. @DisallowConcurrentExecution 注解的作用 【定时器执行完当前任务才开启下一个线程的方式】

    转: @DisallowConcurrentExecution 注解的作用 2018年10月12日 16:42:40 fly_captain 阅读数:4317   Quartz定时任务默认都是并发执行 ...

  2. PIVOT(透视转换)和UNPIVOT(逆透视转换)

    一.原数据状态 二.手动写透视转换1 三.手动写透视转换2 四.PIVOT(透视转换)和UNPIVOT(逆透视转换)详细使用 使用标准SQL进行透视转换和逆视转换 --行列转换 create tabl ...

  3. sql的行转列(PIVOT)与列转行(UNPIVOT) webapi 跨域问题 Dapper 链式查询 扩展 T4 代码生成 Demo (抽奖程序)

    sql的行转列(PIVOT)与列转行(UNPIVOT)   在做数据统计的时候,行转列,列转行是经常碰到的问题.case when方式太麻烦了,而且可扩展性不强,可以使用 PIVOT,UNPIVOT比 ...

  4. 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/ ...

  5. IIS下的身份验证方式管理

    设置.查看身份验证方式 #导航到某站点下: cd IIS:\Sites\DemoSite\DemoApp #启用站点test01下的Windows身份验证 Set-WebConfigurationPr ...

  6. Linux/centos/redhat下各种压缩解压缩方式详解

    1.zip命令 zip -r myfile.zip ./* 将当前目录下的所有文件和文件夹全部压缩成myfile.zip文件,-r表示递归压缩子目录下所有文件. 2.unzip unzip -o -d ...

  7. AndroidUI组件之ActionBar--基于下拉的导航方式

      在上一篇关于ActionBar的博文中.我们知道了ActionBar是Android3.0的重要更新之中的一个.本篇博文就来写一个开发中经经常使用到的样例.用ActionBar提供基于下拉的导航方 ...

  8. Linux 和 Windows 下实现多进程的方式以及管道操作

    一.多进程 1.windows 多进程 使用 #include<windows.h> 下面的 BOOL CreateProcess( LPCWSTR pszImageName, LPCWS ...

  9. ipv6下jdbc的连接数据库方式

    ipv6下jdbc的连接数据库方式 MySQL: ipv4 Driver URL:           jdbc:mysql://127.0.0.1:3306/database   ipv6 Driv ...

随机推荐

  1. Calling startActivity() from outside of an Activity

    在Activity中使用startActivity()方法不会有任何限制,因为Activity重载了Context的startActivity()方法.但是如果是在其他地方(如Widget或Servi ...

  2. 研究base64_encode的算法

    从网上看了一些资料,为了方便自己理解,于是把它的编码原理,自己放在excel表格中清晰列出来,方便以后查阅.做的图如下:

  3. Mybatis分页插件 - PageHelper

    1.说明 如果你也在用Mybatis,建议尝试该分页插件,这个一定是最方便使用的分页插件. 该插件目前支持Oracle,Mysql,MariaDB,SQLite,Hsqldb,PostgreSQL六种 ...

  4. Hadoop学习笔记1-如何简单布署hadoop

    企业机型配置: 选型标准:普通的,廉价的,标准的(容易替换的),工业化大规模生产的 CPU:支持多核CPU,如2个4核CPU 内存:16G以上,内存越大,常用数据都缓存在内存,提高速度 硬盘:不需RA ...

  5. 对datatable操作,查询

    #region DataTable筛选,排序返回符合条件行组成的新DataTable或直接用DefaultView按条件返回 /// <summary> /// DataTable筛选,排 ...

  6. [转载]Context and Interception : The .NET Context

    转载自:Context and Interception : The .NET Context Every new app domain starts with a single context, c ...

  7. PhotoSwipe - 移动开发必备的 iOS 风格相册

    PhotoSwipe 是一个专门针对移动设备的图像画廊,它的灵感来自 iOS 的图片浏览器和谷歌移动端图像. PhotoSwipe 提供您的访客熟悉和直观的界面,使他们能够与您的移动网站上的图像进行交 ...

  8. Codrops 实验:使用 Vibrant.js 提取图像颜色

    Codrops 分享了一个有趣的颜色提取实验.这个想法是创建图像的调色板,既有图像本身的潜移默化的影响,也有一些花哨的颜色延伸.通过使用 Vibrant.js 来提取图像中的颜色,并通过 CSS 过滤 ...

  9. CSV.js – 用于 CSV 解析和编码的 JS 工具库

    逗号分隔值(CSV )文件用于以以纯文本的形式存储表格化数据(数字和文本). CSV 文件包含任意数量的记录,通过某种换行符分隔,每条记录由字段,其他一些字符或字符串分隔,最常用的是文字逗号或制表符. ...

  10. mongodb 数据库操作--备份 还原 导出 导入

    mongodb数据备份和还原主要分为二种,一种是针对于库的mongodump和mongorestore,一种是针对库中表的mongoexport和mongoimport 一,mongodump备份数据 ...