Oracle将每个“n”列转换为行

时间:2018-03-14 08:44:12

标签: oracle transpose

我有一个SQL,它以下面的格式创建了几个度量标准,我想将它们转换成每个第n列的行,例如,每4行剪切一次并转换成行。也可以有'n'个列,即12,20,40等(在我的情况下为4的倍数)。

我需要将这些行加载到表中。

查找以下示例,

enter image description here

示例数据。

SELECT 1 AS col1, 'Total number of Customer' AS col2, 100 AS col3, NULL AS col4,
       1.1 AS col5, 'Total active customers' AS col6, 50 AS col7, NULL AS col8,
       1.2 AS col9, 'Total inactive customers' AS col10, 50 AS col11,ABC AS col12
  FROM DUAL;

注意:列数可能为n。它可以是12,40(在我的情况下是4的倍数)。

2 个答案:

答案 0 :(得分:0)

您可以使用4列组的联合:

SELECT Col1 AS "S.No", Col2 AS "Metric Name", Col3 AS Count, Col4 AS Example
FROM yourTable
UNION ALL
SELECT Col5, Col6, Col7, Col8
FROM yourTable
UNION ALL
SELECT Col9, Col10, Col11, Col12
FROM yourTable
ORDER BY 1

我想知道你是如何得到这样一个表的,但无论如何我建议使用上述查询的输出作为你的数据的新版本。

答案 1 :(得分:0)

这是一个解决方案。

with cte as (
    SELECT 1 AS col1, 'Total number of Customer' AS col2, 100 AS col3, NULL AS col4,
           1.1 AS col5, 'Total active customers' AS col6, 50 AS col7, NULL AS col8,
           1.2 AS col9, 'Total inactive customers' AS col10, 50 AS col11,ABC AS col12
      FROM DUAL
)
select col1, col2, col3, col4 from cte
union all
select col5, col6, col7, col8 from cte
union all
select col9, col10, col11, col12 from cte
order by 1
;

然而,这看起来像应该在显示客户端而不是在SQL中真正处理的那种格式。

  

“可能有'n'个列。它可以是12,40(在我的情况下是4的倍数)”

然后更应该在客户端处理它。因为实现任意投影的唯一方法是使用动态SQL:编写PL / SQL函数以为参数化查询和列数生成定制的SQL语句。问题是,你必须返回一个弱的引用光标,因为在编译时投影是未知的。