1

假设我有一个名为PROFILE的表,其中一列是如下名称

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

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

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

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

4

2 回答 2

3

假设您总是需要 3 列,那么这将使用MAXwithCASE来执行枢轴,以及ROW_NUMBER()and 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子句中添加字段,您将无法保证结果的特定顺序。

于 2013-07-13T17:34:11.390 回答
1

我认为解决这个问题的最简单方法是使用 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-07-13T18:17:45.620 回答