暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

Oracle 如何使用或不使用pivot/pivot xml的更改列标题动态转置数据?

ASKTOM 2020-11-24
2359

问题描述

这个问题最常见,没有明确的解决方案。
我有2种动态透视方案,所请求的解决方案可以使用pivot xml (已尝试,但提取是一项任务)/动态sql执行/arays,如果可能的话,我们可以使用 ..

场景1:

在第一种情况下,我需要在数据源为同一表的地方透视数据。但是,枢轴必须是动态的,因为列标题将根据列app_id不断变化。所以如果app_id = 1。列标题将是A,B,C,D,如果app_id = 2,则列将是CDEF,依此类推。此外,每组值都有一个id。因此,对于id,120和app_id = 1,列A,B,C,D将显示值等。

当前的样本数据只有2个app_id,但可能还有更多,所以app_id和标签会改变,因此我需要编写一个动态查询。

表是DATA_1

ID  label   value   app_id
--- -----   -----   ------
120 A       Alpha   1
120 B       Beta    1
120 C       Class   1
120 D       Delta   1
120 C       Alpha   2
120 D       Beta    2
120 E       Class   2
120 F       Delta   2

预期的产出会是这样的。

P.s.数据是虚拟和app_ids,并且ids将通过更改列标题不断插入和删除,因此需要动态解决方案。

SELECT * FROM data WHERE ID = 120 AND app_id = 1;    
app_id  A        B      C      D      ID
------  ------   -----  -----  -----  -----
1       Alpha    Beta   Class  Delta  120

SELECT * FROM data WHERE ID = 120 AND app_id = 2;    
app_id  C        D      E      F      ID
------  ------   -----  -----  -----  -----
2       Alpha    Beta   Class  Delta  120



场景2:

这里有一个表中的数据。现在,我们有了包含标签的单独表和带有值的当前表。

因此,在场景1的表中,我们将仅关注id,app_id和值列。

从data_1中选择app_id,id,值;

标签将来自列Header_Name中的另一个表DATA_Labels:

APP_ID SEQ HEADER_NAME
1 1 A
1 2 B
1 3 C
1 4 D
1 5 E
1 6 F
1 7 G
1 8 H
1 9 I
1 10 J
2 1 P
2 2 Q
2 3 R
2 4 S
2 5 T
2 6 U
2 7 V
2 8 W
2 9 X
2 10 Y


因此,对于标签,我们将使用header_names。Data_1和Data_Labels可以基于app_id连接。

如果值超过列标题,我们可以假设标题将达到最大20。如果标题/名称不可用,则可以放置一些默认的标题名称,例如COL11,COL12,如果该值一直延伸到那里。

我做了很多研究,但大多数解决方案太复杂和混乱。任何线索都将不胜感激。

专家解答

可悲的是,这个问题没有好的解决方案。

选项包括:

-首先运行查询以生成pivot子句

select listagg ( '''' || header_name || ''' as ' || header_name, ',' ) 
         within group ( order by seq ) 
from   data_labels
where  app_id = :app


然后将其输出连接到查询表的动态SQL语句

-使用自定义类型

获取Anton Scheffer的pivot函数,它允许您传递查询以生成列:

https://technology.amis.nl/2006/05/24/dynamic-sql-pivoting-stealing-antons-thunder/

这两个都有缺点; 我在我的pivot/unpivot指南的动态列列表部分中进一步讨论这些:

https://blogs.oracle.com/sql/how-to-convert-rows-to-columns-and-back-again-with-sql-aka-pivot-and-unpivot
文章转载自ASKTOM,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论