在Oracle中将一列的数据显示为一行

Display data of a column as a row in Oracle

首先,非常感谢您提前抽出时间。

我有一个table如下图:

COL_TAB
----------------------------------------------
| TABLE_NAME | COL_NAME   | COL_DESC         | 
----------------------------------------------
| TABLE1     | TAB1_COL_2 | TABLE 1 COLUMN 2 |
| TABLE1     | TAB1_COL_4 | TABLE 1 COLUMN 4 |
| TABLE1     | TAB1_COL_3 | TABLE 1 COLUMN 3 |
| TABLE1     | TAB1_COL_5 |                  |
| TABLE1     | TAB1_COL_1 | TABLE 1 COLUMN 1 |
----------------------------------------------

我想显示上面table的数据,如下所示:

------------------------------------------------------------------------------------------------
| TABLE 1 COLUMN 2 | TABLE 1 COLUMN 1 | TAB1_COL_5       | TABLE 1 COLUMN 2 | TABLE 1 COLUMN 4 |
------------------------------------------------------------------------------------------------

如果行的 COL_DESC 中没有数据,则需要显示 COL_NAME 列中的数据。

我确实问过一个类似的问题 ,但是这个问题的标准相当复杂。我想知道如何以最简单的方式将单列数据转换为一行。

下面是我试过的代码。

SELECT NVL(COL_DESC, COL_NAME) 
FROM
(
 SELECT NVL(COL_DESC, COL_NAME), COL_NAME
 FROM COL_TAB
 WHERE TABLE_NAME = 'TABLE1'
)
PIVOT
(
 MIN(COL_NAME)
 FOR COL_NAME IN (SELECT COL_NAME FROM COL_TAB WHERE TABLE_NAME = 'TABLE1'
)

如果有人能帮我解决这个问题,我将不胜感激。再次感谢您的宝贵时间和帮助。

据我所知,我们不能在 pivot 子句中使用查询(当我们需要 IN 作为动态时,可能只有 XML 才有可能,我不太熟悉),但是通过指定col_name明确我们可以实现它,

SELECT MAX(tab1_col_1)
      ,MAX(tab1_col_2)
      ,MAX(tab1_col_3)
      ,MAX(tab1_col_4)
      ,MAX(tab1_col_5)
FROM   (SELECT coalesce(col_desc
                       ,col_name) col_desc
              ,col_name
              ,table_name
        FROM   col_tab
        WHERE  table_name = 'TABLE1')
PIVOT
(
 MIN(col_desc)
 FOR col_name IN('TAB1_COL_1' AS tab1_col_1
                ,'TAB1_COL_2' tab1_col_2
                ,'TAB1_COL_3' tab1_col_3
                ,'TAB1_COL_4' tab1_col_4
                ,'TAB1_COL_5' tab1_col_5)
)

这是您要找的吗?