如何从 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 列,那么这将使用 MAX
和 CASE
以及 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?