pivot 与 unpivot函数
pivot 与 unpivot函数
pivot 与 unpivot 函数是SQL05新提供的2个函数 灰常灰常的实用
------------------------------------------------------------------------------
pivot函数:
create table test(id int,name varchar(20),quarter int,profile int)
insert into test values(1,'a',1,1000)
insert into test values(1,'a',2,2000)
insert into test values(1,'a',3,4000)
insert into test values(1,'a',4,5000)
insert into test values(2,'b',1,3000)
insert into test values(2,'b',2,3500)
insert into test values(2,'b',3,4200)
insert into test values(2,'b',4,5500)
select * from test --创建表test
现在需要把quarter 从1列数据变成4列数据 效果如:
把一列拆成几列这时候就能使用pivot函数很简单的实现
select * from test
pivot
(
sum([profile]) for [quarter]
in
([1],[2],[3],[4])
)
as
s
注:使用pivot把一列拆成几列时 需要后面as取个别名 这是固定的格式 同时如 for前是必须使用聚合函数的
当然不使用pivot函数也可以得到相同效果 只是代码长切效率低 但容易理解
select id,[name],
'1'=(select sum([profile]) from test where id=a.id and quarter=1),
'2'=(select sum([profile]) from test where id=a.id and quarter=2),
'3'=(select sum([profile]) from test where id=a.id and quarter=3),
'4'=(select sum([profile]) from test where id=a.id and quarter=4)
from test as a
group by id,name
-----------------------------------------------------------------------------------------
unpivot函数 顾名思义 他就是把几列合并到1列中去
create table test1(id int,name varchar(20), Q1 int, Q2 int, Q3 int, Q4 int)
insert into test1 values(1,'a',1000,2000,4000,5000)
insert into test1 values(2,'b',3000,3500,4200,5500)
select * from test1 --创建test1表
我们要把Q1 Q2 Q3 Q4合到1列 季度列中去 如效果:
使用unpivot可以很简单的实现
select id ,[name],[jidu],[xiaoshou] from test1
unpivot
(
xiaoshou for jidu in
([q1],[q2],[q3],[q4])
)
as f
注:同样需要使用as取别名同样是固定的格式 unpivot函数中没有聚合函数 xiaoshou和jidu列都是原来没有的 jidu表由原来的Q1 Q2 Q3 Q4组成
SQL UNPIVOT 多列
先準備測試資料如下,
create table T (
no varchar(10),
yearx varchar(4),
z_type varchar(1),
A01 smallint,
B01 smallint,
A02 smallint,
B02 smallint,
A03 smallint,
B03 smallint
)
go
insert into T VALUES('Z01','2012','1',100,-10,200,30,50,60);
insert into T VALUES('Z01','2012','3',200,20,100,20,30,40);
insert into T VALUES('Z01','2013','3',300,30,10,50,70,30);
SELECT * FROM T;
因為原本欄位A01, A02, A03要放到欄位A,B01, B02, B03要放到欄位B,所以需要2個UNPIVOT,如下,
SELECT no, yearx, z_type, A, B, x1, x2
FROM
(SELECT *
FROM T) p
UNPIVOT ( A FOR x1 IN (A01, A02, A03) )AS UnA
UNPIVOT ( B FOR x2 IN (B01, B02, B03) )AS UnB
上面的輸出筆數為27筆,而我們可以發現,x1, x2欄位中,A01 搭配 B01,A02 要搭配 B02,A03 要搭配 B03,如下圖所示,
所以我們需要再加入 關鍵的 WHERE 條件, RIGHT(x1, 1) = RIGHT(x2, 1),就可以過濾出我們所需要的資料,如下,
SELECT no, yearx, z_type, A, B, x1, x2
FROM
(SELECT *
FROM T) p
UNPIVOT ( A FOR x1 IN (A01, A02, A03) )AS UnA
UNPIVOT ( B FOR x2 IN (B01, B02, B03) )AS UnB
WHERE substr(x1, -1,1) = substr(x2, -1,1)
參考資料
pivot 与 unpivot函数的更多相关文章
- pivot 与 unpivot 函数是SQL05新提供的2个函数
pivot 与 unpivot 函数是SQL05新提供的2个函数 ----------------------------------------------------------------- ...
- pivot 与 unpivot 函数是SQL05新提供的2个函数 灰常灰常的实用
转自:http://blog.sina.com.cn/s/blog_5ef755720100cyo3.html pivot函数: create table test(id int,name varch ...
- oracle行转列和列转行(pivot 和 unpivot 函数,wm_concat函数 )
create table demo(id int,name varchar(20),nums int); ---- 创建表insert into demo values(1, '苹果', 1000); ...
- 使用 PIVOT 和 UNPIVOT 行转列 列转行 报表统计 函数
官方文档:http://technet.microsoft.com/zh-cn/library/ms177410(v=SQL.105).aspx 可以使用 PIVOT 和 UNPIVOT 关系运算符将 ...
- [转]Oracle SQL函数pivot、unpivot转置函数实现行转列、列转行
原文地址:http://blog.csdn.net/seandba/article/details/72730657 函数PIVOT.UNPIVOT转置函数实现行转列.列转行,效果如下图所示: 1.P ...
- Oracle 行列转换函数pivot、unpivot的使用(二)
一.行转列pivot 关键函数pivot,其用法如下 pivot(聚合函数 for 列名 in(类型)) select * from table_name pivot(max(column_name) ...
- Oracle行转列,pivot函数和unpivot函数
pivot函数:行转列函数: 语法:pivot(任一聚合函数 for 需专列的值所在列名 in (需转为列名的值)):unpivot函数:列转行函数: 语法:unpivot(新增值所在列的列名 for ...
- Oracle11g 行列转换函数PIVOT and UNPIVOT
作为Oracle开发工程师,推荐大伙看看 PIVOT and UNPIVOT Operators in Oracle Database 11g Release 1 This article shows ...
- oracle 行转列函数pivot和unpivot
今天接到业务部门的一个需求,需要对同一公司的不同财务指标进行排序,需要用到oracle的行转列函数unpivot. 财务报表的表结构为: 要实现业务部门的排序筛选功能,需要首先将行数据转为列数据: 使 ...
随机推荐
- HDU4372-Count the Buildings【第一类Stirling数】+【组合数】
<题目链接> <转载于 >>> > 题目大意: N座高楼,高度均不同且为1~N中的数,从前向后看能看到F个,从后向前看能看到B个,问有多少种可能的排列数. 0 ...
- python爬虫之反爬虫(随机user-agent,获取代理ip,检测代理ip可用性)
python爬虫之反爬虫(随机user-agent,获取代理ip,检测代理ip可用性) 目录 随机User-Agent 获取代理ip 检测代理ip可用性 随机User-Agent fake_usera ...
- Dart语言特性必备了解!
学习Dart语言,必须将以下的概念熟记于心: 在dart语言中,一切皆为对象.所有的对象都是一个类的实例.甚至整数.函数.null也看做是对象.所有的对象都继承于Object类 尽管Dart是强类型语 ...
- ogg - 从oracle到mysql的同步
说明:这篇文章将介绍如何配置oracle到mysql的ogg同步 源端:ip-192.168.56.11 数据库类型-oracle 11.2.0.4目标端:ip-192.168.56.71 数据库类型 ...
- sleep() 和 wait() 有什么区别?
sleep:Thread类中定义的方法,表示线程休眠,会自动唤醒: wait:Object中定义的方法,需要手工调用notify()或者notifyAll()方法. sleep是线程类(Thread ...
- osds have slow requests
ceph health detailHEALTH_WARN 14 requests are blocked > 32 sec; 11 osds have slow requests7 ops a ...
- 在Windows下食用Linux工作环境(WSL+cmder)
在Windows下食用Linux工作环境(WSL+cmder) 为什么要这么瞎搞呢?因为最近换了个硬盘,搞了个双系统,然后习惯性地按下 Ctrl+Alt+T 发现什么都没有召唤出来,然后忽然想起换了系 ...
- 潭州课堂25班:Ph201805201 并发 第九课 (课堂笔记)
TCP/IP 1,建立连接(三次握手) 1,客户端发起请求 2,服务器请求回应 3,请求确认,双方建立连接 2,数据传输 3,断开连接(四次挥手) 1,客户端请求断开 连接 2,服务器回应请求 3,服 ...
- 添加 vip
两台机器:172.16.91.101 172.16.91.107 在91.101上增加虚拟ip,92网段的 ifconfig eth0:1 172.16.92.2 netmask 255.255.25 ...
- 使用OClint进行iOS项目的静态代码扫描
使用OClint进行iOS项目的静态代码扫描 原文链接:http://blog.yourtion.com/static-code-analysis-ios-using-oclint.html 最近需要 ...