halo数据库pivot与unpivot
SELECT ...FROM ...PIVOT(pivot_agg_clause #定义进行聚集的列pivot_for_clause #定义需要分组和转置的列pivot_in_clause #定义限定结果集的值的范围)WHERE ...
pivot_in_clause语法图如下
PIVOT 示例
CREATE TABLE part (partname varchar2(32),manufacturer varchar2(32),quality int,price decimal(12, 2));INSERT INTO part VALUES ('prop', 'local parts co', 2, 10.00);INSERT INTO part VALUES ('prop', 'big parts co', NULL, 9.00);INSERT INTO part VALUES ('prop', 'small parts co', 1, 12.00);INSERT INTO part VALUES ('rudder', 'local parts co', 1, 2.50);INSERT INTO part VALUES ('rudder', 'big parts co', 2, 3.75);INSERT INTO part VALUES ('rudder', 'small parts co', NULL, 1.90);INSERT INTO part VALUES ('wing', 'local parts co', NULL, 7.50);INSERT INTO part VALUES ('wing', 'big parts co', 1, 15.20);INSERT INTO part VALUES ('wing', 'small parts co', NULL, 11.80);
halo0root=# SELECT * FROM(SELECT partname, price FROM part)PIVOT (AVG(price) FOR partname IN ('prop' AS prop, 'rudder' AS rudder, 'wing' AS wing));+---------------------+--------------------+------+| prop | rudder | wing |+---------------------+--------------------+------+| 10.3333333333333333 | 2.7166666666666667 | 11.5 |+---------------------+--------------------+------+(1 row)
halo0root=# SELECT *FROM (SELECT quality, manufacturer FROM part) PIVOT (count(*) FOR quality IN (1, 2));+----------------+---+---+| manufacturer | 1 | 2 |+----------------+---+---+| local parts co | 1 | 1 || big parts co | 1 | 1 || small parts co | 1 | 0 |+----------------+---+---+(3 rows)
halo0root=# SELECT *FROM (SELECT quality, manufacturer FROM part)PIVOT ( count(*) AS count FOR quality IN (1, 2 AS low));+----------------+---------+-----------+| manufacturer | 1_count | low_count |+----------------+---------+-----------+| local parts co | 1 | 1 || big parts co | 1 | 1 || small parts co | 1 | 0 |+----------------+---------+-----------+(3 rows)
halo数据库PIVOT 的使用说明:
UNPIVOT则比一系列复杂的 LATERAL 语句中所指定的语法更简单和更具可读性。
halo数据库UNPIVOT 语法如下:
SELECT ...FROM ...UNPIVOT(unpivot_val_clause #定义反转置值的列名unpivot_for_clause #定义反转置所得到列的列名称unpivot_in_clause #定义进行反转置已转置列的列表)WHERE ...
unpivot_val_clause语法图显示如下:
unpivot_for_clause语法图显示如下:
unpivot_in_clause语法图显示如下:
UNPIVOT 示例
CREATE TABLE count_by_color (quality varchar, red int, green int, blue int);INSERT INTO count_by_color VALUES ('high', 15, 20, 7);INSERT INTO count_by_color VALUES ('normal', 35, NULL, 40);INSERT INTO count_by_color VALUES ('low', 10, 23, NULL);
halo0root=# SELECT *halo0root-# FROM (SELECT red, green, blue FROM count_by_color)halo0root-# UNPIVOT ( cnt FOR color IN (red, green, blue));+-------+-----+| color | cnt |+-------+-----+| red | 15 || green | 20 || blue | 7 || red | 35 || blue | 40 || red | 10 || green | 23 || red | 50 |+-------+-----+(8 rows)
halo0root=# SELECT *halo0root-# FROM (halo0root(# SELECT red, green, bluehalo0root(# FROM count_by_colorhalo0root(# ) UNPIVOT INCLUDE NULLS (cnt FOR color IN (red, green, blue));+-------+-----+| color | cnt |+-------+-----+| red | 15 || green | 20 || blue | 7 || red | 35 || green | || blue | 40 || red | 10 || green | 23 || blue | || red | 50 || green | || blue | |+-------+-----+(12 rows)
halo0root=# SELECT *halo0root-# FROM count_by_color UNPIVOT (halo0root(# cnt FOR color IN (red, green, blue)halo0root(# );+---------+-------+-----+| quality | color | cnt |+---------+-------+-----+| high | red | 15 || high | green | 20 || high | blue | 7 || normal | red | 35 || normal | blue | 40 || low | red | 10 || low | green | 23 || low | red | 50 |+---------+-------+-----+(8 rows)
halo0root=# SELECT * FROM count_by_colorUNPIVOT (cnt FOR color IN (red AS 'r', green AS 'g', blue AS 'b'));+---------+-------+-----+| quality | color | cnt |+---------+-------+-----+| high | r | 15 || high | g | 20 || high | b | 7 || normal | r | 35 || normal | b | 40 || low | r | 10 || low | g | 23 || low | r | 50 |+---------+-------+-----+(8 rows)
将表中多个列缩减为一个聚合列,例: 值聚合名 FOR 聚合列名 IN (表列名1 AS 常量别名1, 表列名2 AS 常量别名2...)。 将表中多个列集合缩减为一个聚合列,例:(值聚合名1,值聚合名2) FOR 聚合列名 IN ((表列名1, 表列名2)AS (常量别名1), (表列名3,表列名4)...)。
将表中多个列缩减为多个聚合列,例:值聚合名 FOR (聚合列名1,聚合列名2) IN (表列名1 AS (常量别名1,常量别名2), 表列名2 ...)。
将表中多个列集合缩减为多个聚合列相对应,例:(值聚合名1,值聚合名2) FOR (聚合列名1, 聚合列名2) IN ((表列名1, 表列名2) AS (常量别名1,常量别名2), (表列名3,表列名4)...)。