如何在DB2中将ROW转置为Column

bd1hkmkf  于 2022-11-07  发布在  DB2
关注(0)|答案(3)|浏览(287)

在DB2中,如何将一个简单“select * from***TABLE***只提取前1行”查询输出行转换为列?

***TABLE**名称可以是动态的,因此必须在select中使用()。

TIA为您的意见和建议。
示例:
发件人:
| F1代|二层|三层|
| - -|- -|- -|
| ABC公司|定义|GHI系统|
至:
| F1代|
| - -|
| ABC公司|
| 定义|
| GHI系统|

4jb9z9bj

4jb9z9bj1#

请尝试使用下面的通用表函数。
第一个参数是任何有效的SELECT语句文本。
第2个参数是此SELECT语句中要转换的列名的列表。

CREATE OR REPLACE FUNCTION MYSCHEMA.UNPIVOT (P_STMT VARCHAR (32000), P_COLLIST VARCHAR (100))
RETURNS TABLE (C VARCHAR (100))
BEGIN
    DECLARE SQLCODE INT;
    DECLARE V_VAL VARCHAR (100);
    DECLARE C1 CURSOR FOR S1;

    PREPARE S1 FROM 'SELECT V.C_ FROM (' || P_STMT || '), TABLE (VALUES ' || P_COLLIST || ') V (C_)';
    OPEN C1;
    L1: LOOP
        FETCH C1 INTO V_VAL;
        IF SQLCODE = 100 THEN LEAVE L1; END IF;
        PIPE (V_VAL);
    END LOOP L1;
    CLOSE C1;
    RETURN;
END
@

您必须:
构造SELECT语句以仅返回字符串列并指定简单的列列表:

SELECT * 
FROM TABLE (MYSCHEMA.UNPIVOT (
    'SELECT * FROM (VALUES (CHAR (1), ''2'', CHAR (CURRENT DATE))) T (C1, C2, C3)'
  , 'C2, C3'
)) T

或者将列列表中的每个非字符串列显式转换为CHAR:

SELECT * 
FROM TABLE (MYSCHEMA.UNPIVOT (
    'SELECT * FROM (VALUES (1, ''2'', CURRENT DATE)) T (C1, C2, C3)'
  , 'CHAR (C1), CHAR (C3)'
)) T
bprjcwpo

bprjcwpo2#

简而言之,你不能。
在Db2 for IBM i中,没有任何内容可以使用SELECT *和动态表来完成此操作。
很长的答案,您可以构建一个存储过程或用户定义的表函数,动态构建并执行一个类似于以下内容的老式语句:

with firstRow as 
  (select F1, F2, F3 from table fetch first row only)
select F1
from firstRow
UNION ALL 
select F2
from firstRow
UNION ALL
select F3
from firstRow;

或者,由于您使用的是v7.4,您可以构建并执行一个动态语句,将字段CONCAT为字符串列表,然后使用SPLIT() table function将列表解构为行。
最后,您可能能够构建并执行一个动态语句,该语句使用JSON函数构建JSON数组,然后使用JSON_TABLE()函数将该数组分解为行。
但正如所强调的,在所有情况下,您都需要知道实际SELECT语句的列名和表名,因此需要动态构建语句。

soat7uwm

soat7uwm3#

您可以尝试使用Lateral

select 
   Key, value
from mytable T,
      lateral (values ('F1', t.F1)
                      , ('F2', t.F2) 
                      , ('F3', t.F3)
                      ) as mypivot(key, value);

相关问题