【问题标题】:how to create a view of multiple columns from one column structure in oracle sql?如何从 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,对于这种情况,我只想将其分成三组。

标签: sql database view oracle11g multiple-columns


【解决方案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)

【讨论】:

    猜你喜欢
    • 2013-06-23
    • 2021-07-22
    • 2010-11-14
    • 2017-03-30
    • 2023-04-05
    • 1970-01-01
    • 2019-08-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多