如何从 oracle sql 中的一个列结构创建多个列的视图?

Posted

技术标签:

【中文标题】如何从 oracle sql 中的一个列结构创建多个列的视图?【英文标题】:how to create a view of multiple columns from one column structure in oracle sql? 【发布时间】:2013-07-13 17:11:27 【问题描述】:

假设我有一个名为 PROFILE 的表,其中一列是 names,如下所示:

|NAMES|
-------
JAMES
-------
ANDY
-------
PETER
-------
SARAH
-------
JESSICA
-------
RACHEL

我怎样才能使视图显示如下:

|col1  | col2| col3   |
-------|-----|--------|
|JAMES  |PETER|JESSICA|
-------|-----|------- |
|ANDY   |SARAH|RACHEL |
----------------------       

我需要这个的原因是因为我需要将它与 apex 报告页面一起使用,我打算做一个网格样式布局。有点难以解释,但这就是我想要的结构 喜欢达到。这有没有可能?查询会不会有太多行?

【问题讨论】:

哪些记录对应哪些列?可能超过 3 列(即您是否在寻找动态列数)? 您能否详细说明名称的顺序?为什么选择詹姆斯|彼得|杰西卡?或者你只是想分成三个名字的组? 您的PROFILE 表是否总是正好有六行,或者您是否尝试动态创建列?看起来您希望PROFILE 中的“奇数”编号行分布在结果的第一行,而“偶数”编号的行则分布在第二行。对吗? @user2480596,现在我希望它是三列。如果我能理解解决方案,我可能会将其分成两列,每列有 3 行。基本上我想知道如何从一列拆分为多列。 @NicholasKrasnov,对于这种情况,我只想将其分成三组。 【参考方案1】:

假设您总是需要 3 列,那么这将使用 MAXCASE 以及 ROW_NUMBER()MOD() 来执行数据透视:

SELECT MAX(CASE WHEN rn = 1 THEN name END) col1,
  MAX(CASE WHEN rn = 2 THEN name END) col2,
  MAX(CASE WHEN rn = 3 THEN name END) col3
FROM (
  SELECT Row_Number() Over (Partition By MOD(ROWNUM,2) Order By Null) rn, MOD(ROWNUM,2) whichGroup, name
  FROM profile
  ) talias
GROUP BY whichGroup

使用MOD 获取哪些行并使用Row_Number 作为数据透视表。

SQL 小提琴:http://sqlfiddle.com/#!4/46149/1

-- 请注意,如果不向您的 ORDER BY 子句添加字段,您将无法保证结果的特定顺序。

【讨论】:

感谢@user2480596。不太了解您的注释中的 order by。如果我需要 order by,我应该在哪里以及如何放置它?我试图把它放在 FROM 配置文件之后,但没有用。需要以相同的顺序排列名称。有可能吗?【参考方案2】:

我认为解决这个问题的最简单方法是使用 Oracle 内置的rownum 变量,然后使用整数除法(确定行)和mod() 确定列:

SELECT MAX(CASE WHEN mod(seqnum, 3) = 0 THEN name END) as col1,
       MAX(CASE WHEN mod(seqnum, 3) = 1 THEN name END) as col2,
       MAX(CASE WHEN mod(seqnum, 3) = 2 THEN name END) as col3
FROM (SELECT name, rownum as seqnum
      FROM profile
     ) t
GROUP BY trunc((seqnum - 1) / 3)

【讨论】:

以上是关于如何从 oracle sql 中的一个列结构创建多个列的视图?的主要内容,如果未能解决你的问题,请参考以下文章

如何从 oracle pl sql 中的包主体内的 select 语句中捕获特定列

如何根据 Oracle SQL 中的某些条件将列拆分为 2?

ORACLE 创建一个表

如何在 SQL 中对触发器进行语法化,以便在插入后从同一个表中更新列(oracle 数据库)

SQL 如何从单个列中的所有值创建 JSON 数组

如何在 SQL 中使用 C# 创建列