1. 程式人生 > 其它 >KINGBASE 支援pivot and unpivot 功能

KINGBASE 支援pivot and unpivot 功能

KINGBASE 通過擴充套件外掛支援了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)
KINGBASE研究院