在数据库操作中数据透视是一种常见的需求,它涉及到将行数据转换为列数据(Pivot)或将列数据转换为行数据(Unpivot)。在上一篇介绍文章中我们介绍了Pivot函数,在本篇文章中我们来看看Unpivot函数吧。
想看上一篇文章,请点击:南大通用GBase 8s pivot行转列函数功能介绍
GBase 8s unpivot函数的概述
Unpivot是Pivot操作的逆过程。它将表格中的一个或多个列转换为多个行,每个行包含一个唯一的值。这种转换使得原本在列中的多个值分布在多行中,从而可以对这些值进行纵向分析。
GBase 8s Unpivot的语法详解
在GBase 8s中,Unpivot操作的语法同样简单明了。通过指定目标字段和源字段,我们可以将数据从列格式转换为行格式,从而实现数据的深入分析。
SELECT ...
FROM ...
UNPIVOT [INCLUDE|EXCLUDE NULLS] --- 转换结果中是否包含NULL值的行,缺省不包含空值
(unpivot_val_col_lst --- 目标字段,新增值所在的列的列名
unpivot_for_clause --- 目标字段 ,新增列转换行后所在列的列名
unpivot_in_clause --- 源字段 ,需要转换为行的列名
)
WHERE ...
GBase 8s Unpivot示例
先创建一个 pivot 操作后的结果集用于unpiovt的举例。
create view v_emp as select from (SELECT deptno,job, sal1 FROM emp)
PIVOT( SUM(sal1)
FOR deptno IN
(10 as d1, 20 d2,30 d3)) ;
select from v_emp;
Result:
job d1 d2 d3
president 5000.00
manager 2450.00 5825.00
salesman 1500.00 1250.00 2850.00
clerk 800.00 3000.00
4 row(s) retrieved.
--用例1:
SELECT * FROM v_emp
UNPIVOT
(
deptsal ---指定列转换行后计算值的列的列名
FOR saldesc ---指定列转换行后所在列的列名
IN (d1, d2, d3) --需要转换成行的列
);
Result:
job saldesc deptsal
president d1 5000.00
manager d1 2450.00
manager d2 5825.00
salesman d1 1500.00
salesman d2 1250.00
salesman d3 2850.00
clerk d1 800.00
clerk d2 3000.00
8 row(s) retrieved.
GBase 8s的unpivot转换查询注意事项
unpivot 查询可以作用于任何例,不仅仅是聚合后的列或 pivot 操作后的列,可以对任何表、任何视图的列进行 unpivot操作。
一个 unpivot 查询可以返回的最大行数为:分组数 unpivot_in_clause 中指定的转换操作列(上述列子中为4(job) 3(转换列)=12,默认exclude nulls,不含空行,去掉4个空行,则结果为8)。
GBase 8s限制了unpivot_in_clause 中指定的转换列数目最多 256 列;
GBase 8s要求unpivot_in_clause 中的列必须是相同的数据类型。
GBase 8s要求unpivot_for子句的项个数与unpivot_in子句中的AS项表达式数目保持一致。
在pivot 中,pivot_in_clause 和pivot_clause中可以指定别名。unpivot 语法中也允许使用别名,但是只能给 unpivot_in_clause 中定义的列指定别名。且GBase 8s只能是常量表达式,unpivot_in_clause 中的别名,GBase 8s不能支持加单引号。
其他使用上限制可以参考《GBase 8s V8.8 SQL 指南:语法.pdf》
GBase 8s数据库官方文档:官方文档