logo
GBase 8s
其他
文章

南大通用GBase 8s unpivot列转行函数功能介绍

路路路
发表于2024-09-13 17:46:01465次浏览0个评论

在数据库操作中数据透视是一种常见的需求,它涉及到将行数据转换为列数据(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数据库官方文档:官方文档

评论

登录后才可以发表评论