GaussDB(DWS)迁移 - teredata兼容 - 函数 - pivot/unpivot改写
【摘要】 pivot/unpivot是teredata中用来做行列转换的操作,常用于报表展示场景。GaussDB(DWS)当前并不支持 pivot/unpivot 操作,本文尝试从业务改写的方式,在GaussDB(DWS)中实现类似的功能
【概要】
pivot/unpivot是teredata中用来做行列转换的操作,常用于报表展示场景。GaussDB(DWS)当前并不支持 pivot/unpivot 操作,本文尝试从业务改写的方式,在GaussDB(DWS)中实现类似的功能
【预置条件】
DROP TABLE star1;
CREATE TABLE star1
(
country VARCHAR(20),
state VARCHAR(10),
yr INTEGER,
qtr VARCHAR(3),
sales INTEGER,
cogs INTEGER
);
INSERT INTO star1 VALUES('USA','CA',2001,'Q1',30,15);
INSERT INTO star1 VALUES('Canada','ON',2001,'Q2', 10, 0);
INSERT INTO star1 VALUES('Canada','BC',2001,'Q3', 10 ,0);
INSERT INTO star1 VALUES('USA','NY',2001,'Q1',45, 25);
INSERT INTO star1 VALUES('USA','CA',2001,'Q2', 50 ,20);
SELECT * FROM star1;
DROP TABLE star1p;
CREATE TABLE star1p
(
country VARCHAR(20),
state VARCHAR(20),
Q101Sales INTEGER,
Q201Sales INTEGER,
Q301Sales INTEGER,
Q101Cogs INTEGER,
Q201Cogs INTEGER,
Q301Cogs INTEGER
);
INSERT INTO star1p VALUES('Canada','ON',NULL, 10 ,NULL, NULL, 0, NULL);
INSERT INTO star1p VALUES('Canada','BC', NULL, NULL ,10, NULL, NULL, 0);
INSERT INTO star1p VALUES('USA','NY', 45, NULL, NULL, 25 ,NULL, NULL);
INSERT INTO star1p VALUES('USA','CA', 30 ,50, NULL, 15, 20, NULL);
SELECT * FROM star1p;
【pivot改写】
pivot是用于将行转换为列的关系运算符,常用报表场景,把相关指标按照列维度展示。
具体改写方式:
- 输出列的别名:pivote中的输出列的列名是由FOR..IN后面字句的别名和语法中的聚集函数别名使用‘_’联合构建而成
- 输出列值计算:聚集函数+CASE THEN语句,WHEN语句是FOR..IN后面的枚举值,THEN语句是对应的聚集函数的入参
- 输出列的顺序:输出的列的别名和输出列值的计算是一 一对应的
- GROUP BY语句: GROUP BY后面的列是star1中除了聚集函数和FOR后面列之外的所有其它列
teredata的pivot语法 | GausDB(DWS)等价改写语法 |
|
|
|
|
【unpovit改写】
UNPIVOT是pivot的反向操作,实现了列转行操作
具体改写方式:
- 输出列的别名:FOR后面的列名在前,FOR前面的列名在后(按照括号里面的顺序输出)
- 输出列值计算:首列为IN后面括号里面AS之后的部分,后面的列是IN后面括号里面AS之前部分(按照括号里面的顺序输出)
- 输出列的顺序:输出的列的别名和输出列值的计算是 一 一 对应的
teredata的pivot语法 | GausDB(DWS)等价改写语法 |
|
|
|
|
【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱:
cloudbbs@huaweicloud.com
- 点赞
- 收藏
- 关注作者
评论(0)