我有下表。我需要基于列 CCL 创建列。 CCL 列中的值未知。我不知道从哪里开始。任何帮助,将不胜感激。表ID CCL Flag1 john x1 adam x1 terry1 rob x2 john x询问:SELECT *FROM TABLEA输出:ID John Adam Terry Rob 1 x x x 2 x 最佳答案 与某些其他 RDMBS 相比,对于在执行时列未知的结果使用动态 sql 在 Oracle 中有点麻烦。由于输出的记录类型尚不清楚,因此无法预先定义。在 Oracle 11g 中,一种方法是使用无名过程来生成带有透视结果的临时表。然后从该临时表中选择结果。declare v_sqlqry clob; v_cols clob;begin -- Generating a string with a list of the unique names select listagg(''''||CCL||''' as "'||CCL||'"', ', ') within group (order by CCL) into v_cols from ( select distinct CCL from tableA ); -- drop the temporary table if it exists EXECUTE IMMEDIATE 'DROP TABLE tmpPivotTableA'; EXCEPTION WHEN OTHERS THEN IF SQLCODE != -942 THEN RAISE; END IF; -- A dynamic SQL to create a temporary table -- based on the results of the pivot v_sqlqry := ' CREATE GLOBAL TEMPORARY TABLE tmpPivotTableA ON COMMIT PRESERVE ROWS AS SELECT * FROM (SELECT ID, CCL, Flag FROM TableA) src PIVOT (MAX(Flag) FOR (CCL) IN ('||v_cols||')) pvt'; -- dbms_output.Put_line(v_sqlqry); -- just to check how the sql looks like execute immediate v_sqlqry;end;/select * from tmpPivotTableA; 返回:ID adam john rob terry-- ---- ---- --- -----1 x x x2 x你可以在 dbfiddle here 上找到一个测试在 Oracle 11g 中,可以在这个 Anton Scheffer 中找到另一个要使用的很酷的技巧(由 blog 创建)。但是您必须为它添加枢轴函数。源码可以在in this zip找到之后,SQL 可以像这样简单:select * fromtable(pivot('SELECT ID, CCL, Flag FROM TableA'));你会在 dbfiddle here 上找到一个测试关于sql - Oracle 动态透视,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/50259728/
10-09 04:25