KingbaseES 支持pivot and unpivot 功能
KingbaseES 通过扩展插件支持了pivot 和unpivot 功能。以下以例子的方式介绍。
一、功能介绍
创建扩展:
create extension kdb_utils_function;
具体功能:
- pivot(聚合函数 for 列名 in (类型)),其中 in ('') 中可以指定列名,还可以指定子查询
- pivot(任一聚合函数 for 需转为列的值所在列名 in (需转为列名的值))
- unpivot(新增值所在列的列名 for 新增列转为行后所在列的列名 in (需转为行的列名))
二、PIVOT 行转列
1、创建测试数据
create table pivot_t1(month integer,fruitname text,quantity integer, otherval integer); insert into pivot_t1 values(1,'apple',1000,150);
insert into pivot_t1 values(2,'apple',2000,150);
insert into pivot_t1 values(3,'apple',3000,150);
insert into pivot_t1 values(4,'apple',4000,150);
insert into pivot_t1 values(1,'orange',1500,150);
insert into pivot_t1 values(2,'orange',2500,150);
insert into pivot_t1 values(3,'orange',3500,150);
insert into pivot_t1 values(4,'orange',4500,150);
insert into pivot_t1 values(1,'grape',1800,250);
insert into pivot_t1 values(2,'grape',2800,250);
insert into pivot_t1 values(3,'grape',3800,250);
insert into pivot_t1 values(4,'grape',4800,250);
insert into pivot_t1 values(1,'banana',1600,250);
insert into pivot_t1 values(2,'banana',2600,250);
insert into pivot_t1 values(3,'banana',3600,250);
insert into pivot_t1 values(4,'banana',4600,250);
2、例子
select * from (select month,fruitname,quantity from pivot_t1) pivot(sum(quantity) for fruitname in ('apple' as pingguo,'orange' as juzi,'grape' as putao)); month | pingguo | juzi | putao
-------+---------+------+-------
1 | 1000 | 1500 | 1800
2 | 2000 | 2500 | 2800
3 | 3000 | 3500 | 3800
4 | 4000 | 4500 | 4800 test=# select * from (select month,fruitname,quantity from pivot_t1) pivot(sum(quantity) for fruitname in ('apple' ,'orange','grape'));
month | apple | orange | grape
-------+-------+--------+-------
1 | 1000 | 1500 | 1800
2 | 2000 | 2500 | 2800
3 | 3000 | 3500 | 3800
4 | 4000 | 4500 | 4800
(4 rows) test=# select * from pivot_t1 pivot(sum(quantity) for fruitname in ('apple' ,'orange','grape'));
month | otherval | apple | orange | grape
-------+----------+-------+--------+-------
1 | 150 | 1000 | 1500 |
1 | 250 | | | 1800
2 | 150 | 2000 | 2500 |
2 | 250 | | | 2800
3 | 150 | 3000 | 3500 |
3 | 250 | | | 3800
4 | 150 | 4000 | 4500 |
4 | 250 | | | 4800
(8 rows)
pivot 计算指定的聚合值( sum(quantity) ),但是pivot 不包含显示的group by子句,pivot 隐式group by 是基于所有没在pivot子句中引用的列(month),以及在pivot in子句中指定的一组值。
三、UNPIVOT 列转行
1、创建测试数据
create table unpivot_t1(fruitname text,q1 integer,q2 integer,q3 integer,q4 integer);
insert into unpivot_t1 values('apple', 1100,1200,1300,1400);
insert into unpivot_t1 values('orange',2100,2200,2300,null);
insert into unpivot_t1 values('grape', 3100,null,3300,3400);
insert into unpivot_t1 values('banana',4100,4200,4300,4400);
2、测试结果
select fruitname,month,quantity from unpivot_t1 unpivot include nulls (quantity for month in (q1 as 'Q1',q2 as 'Q2',q3 as 'Q3',q4 as 'Q4')) order by fruitname,month; fruitname | month | quantity
-----------+-------+----------
apple | Q1 | 1100
apple | Q2 | 1200
apple | Q3 | 1300
apple | Q4 | 1400
banana | Q1 | 4100
banana | Q2 | 4200
banana | Q3 | 4300
banana | Q4 | 4400
grape | Q1 | 3100
grape | Q2 |
grape | Q3 | 3300
grape | Q4 | 3400
orange | Q1 | 2100
orange | Q2 | 2200
orange | Q3 | 2300
orange | Q4 |
(16 rows)
四、crosstab 行转列
create extension tablefunc; test=# select * from crosstab('select month,fruitname,quantity from pivot_t1 order by month',$$values('apple'),('orange'),('grape')$$) as sg(month int,pingguo int,juzi int,putao int);
month | pingguo | juzi | putao
-------+---------+------+-------
1 | 1000 | 1500 | 1800
2 | 2000 | 2500 | 2800
3 | 3000 | 3500 | 3800
4 | 4000 | 4500 | 4800
(4 rows) test=# select * from crosstab('select month,fruitname,quantity from pivot_t1 order by month') as sg(month int,"apple" int,"orange" int,"grape" int,"banana" int);
month | apple | orange | grape | banana
-------+-------+--------+-------+--------
1 | 1000 | 1500 | 1800 | 1600
2 | 2500 | 2800 | 2600 | 2000
3 | 3800 | 3500 | 3600 | 3000
4 | 4600 | 4500 | 4000 | 4800
(4 rows)
注意:对于crosstab,order by 非常关键,
KingbaseES 支持pivot and unpivot 功能的更多相关文章
- (1.3)DML增强功能-Apply、pivot、unpivot、for xml path行列转换
深入了解行列转换请参考另一篇文章:https://www.cnblogs.com/gered/p/9271581.html 总结: 1.apply一般形式 --基本形式 SELECT a FROM d ...
- SQL Server 行列相互转换命令:PIVOT和UNPIVOT使用详解
一.使用PIVOT和UNPIVOT命令的SQL Server版本要求 1.数据库的最低版本要求为SQL Server 2005 或更高. 2.必须将数据库的兼容级别设置为90 或更高. 3.查看我的数 ...
- PIVOT 和 UNPIVOT 命令的SQL Server版本
I:使用 PIVOT 和 UNPIVOT 命令的SQL Server版本要求 1.数据库的最低版本要求为 SQL Server 2005 或 更高 2.必须将数据库的兼容级别设置为 90 或 更高 3 ...
- T-SQL行列相互转换命令:PIVOT和UNPIVOT使用详解
最近在维护一个ERP 做二次开发 ,在查找数据源的时候看到前辈写的SQL ,自己能力有限 ,就在网上找找有关这几个关键字的使用方法.做出随笔以做学习之用 T-SQL语句中,PIVOT命令可以实现数据表 ...
- Pivot 和 Unpivot
在TSQL中,使用Pivot和Unpivot运算符将一个关系表转换成另外一个关系表,两个命令实现的操作是“相反”的,但是,pivot之后,不能通过unpivot将数据还原.这两个运算符的操作数比较复杂 ...
- pivot 与 unpivot 函数是SQL05新提供的2个函数
pivot 与 unpivot 函数是SQL05新提供的2个函数 ----------------------------------------------------------------- ...
- PIVOT和UNPIVOT使用详解
一.使用PIVOT实现数据表的列转行 建表语句: DROP TABLE STUDENT; CREATE TABLE STUDENT ( 学生编号 BYTE) NULL , 姓名 BYTE) NULL ...
- [转]Oracle SQL函数pivot、unpivot转置函数实现行转列、列转行
原文地址:http://blog.csdn.net/seandba/article/details/72730657 函数PIVOT.UNPIVOT转置函数实现行转列.列转行,效果如下图所示: 1.P ...
- T-SQL Part IX, PIVOT and UNPIVOT
不同于CROSS JOIN, CROSS APPLY, OUTER APPLY,MSDN文档对PIVOT和UNPIVOT 想得重视了一点,单独做了一个页面来介绍. 简单来说,PIVOT用来把行转成列, ...
随机推荐
- python基础知识-day6(函数知识)
1.函数的特点 函数式的编程范式 面向对象的编程范式 所谓函数,就是把重复的代码单独的分离出来,放在一个公共的地方,以后可以一只调用,这样就可以解决多次重复来编写. 2.函数的定义 1 def fun ...
- RPA-UiPath视频教程2
UiPath参数的介绍和使用 https://www.bilibili.com/video/av83343849 UiPath第一个案例HelloWorld https://www.bilibili. ...
- linux目录结构及定时任务
1. Linux的根目录(最顶层的目录) windows系统有根目录:c盘的根目录就是c:\ d盘的根目录就是d:\ 每个盘(分区)都有自己的根目录 Linux系统, 也支持多个分区 Linux的分区 ...
- BetterScroll源码阅读顺便学习TypeScript
开头 TypeScript已经出来很多年了,现在用的人也越来越多,毋庸置疑,它会越来越流行,但是我还没有用过,因为首先是项目上不用,其次是我对强类型并不敏感,所以纯粹的光看文档看不了几分钟就心不在焉, ...
- NC14893 栈和排序
NC14893 栈和排序 题目 题目描述 给你一个1->n的排列和一个栈,入栈顺序给定 你要在不打乱入栈顺序的情况下,对数组进行从大到小排序 当无法完全排序时,请输出字典序最大的出栈序列 输入描 ...
- cmd中常用的dos命令
在电脑中除了我们常见的图形界面之外,图形页面的操作相信都会.那么还有在cmd执行的一些dos命令,可以简单记一下,方便日后复习所用 首先打开cmd窗口,windows+R,然后在对话框输入cmd,进入 ...
- PTA(BasicLevel)-1094 谷歌的招聘
一.问题定义 2004 年 7 月,谷歌在硅谷的 101 号公路边竖立了一块巨大的广告牌(如下图)用于招聘.内容超级简单,就是一个以 .com 结尾的网址, 而前面的网址是一个 10 位素数,这个素数 ...
- Solution -「CF113D」Museum
Upd 2021.10.21 更改了状态定义. 记 \(S(u)\) 表示 \(u\) 结点的相邻结点的集合. 又记 \(p(u)\) 表示走到了 \(u\) 且下一步继续留在 \(u\) 结点的概率 ...
- 【USACO 2012 Open】奶牛赛跑_题解
奶牛赛跑 目录 奶牛赛跑 题目描述 输入格式 输出格式 样例 样例输入#1 样例输出#1 题解 代码 题目描述 约翰有头奶牛,他为这些奶牛准备了一个周长为的环形跑牛场.所有奶牛从起点同时起跑,奶牛在比 ...
- OpenWrt之feeds.conf.default详解
目录 OpenWrt之feeds.conf.default详解 文件内容 命令解释 src-svn与src-gitsvn src-git与src-git-full src-cpy与src-link 其 ...