【问题标题】:Oracle sql change (dynamic) column orderOracle sql 更改(动态)列顺序
【发布时间】:2015-09-01 00:56:07
【问题描述】:

我知道列的顺序可以从它们被选择的顺序中改变。我的问题涉及的比较多,如果您不理解我的问题,请在 cmets 中提问。

以下是我的查询:

SELECT NVL(status, 'GRAND TOTAL') AS row_labels
      ,NVL(order_source, 'GRAND TOTAL2') AS order_source
      ,count(1) Count#
FROM
SOMETABLE
GROUP BY ROLLUP (status), CUBE(order_source)
order by case
        when status = 'GRAND TOTAL' THEN 2
        ELSE 1
        END;

为简单起见,我说的是“SOMETABLE”,该子句也涉及很多。

这是来自上述查询的数据:

我由此创建了一个视图,并在另一个函数中使用该视图,如下所示:

SELECT * FROM TABLE(
pivot('SELECT * FROM TEST1')
);

这里是pivot之后的数据:

这里有两个问题:

  1. 我希望 Grand Total2 成为最后一列,类似于 Grand Total 是最后一行。
  2. 我还希望将“Grand Total2”标签也设为“GRAND TOTAL”,但是当我在选择查询中将此标签更改为“GRAND TOTAL”时,我得到很多空值,下面是数据。请注意 GRAND TOTAL2 列。标签完全没有变化。

为了清楚起见,这就是我为上面的数字 2 创建一个视图:

SELECT NVL(status, 'GRAND TOTAL') AS row_labels
      ,NVL(order_source, 'GRAND TOTAL') AS order_source
      ,count(1) Count#
FROM
SOMETABLE
GROUP BY ROLLUP (status), CUBE(order_source)
order by case
        when status = 'GRAND TOTAL' THEN 2
        ELSE 1
        END;

pivot函数的源码位于:http://technology.amis.nl/2006/05/24/dynamic-sql-pivoting-stealing-antons-thunder/

感谢您的帮助。

【问题讨论】:

  • 我只是在想我可能需要处理我的 Order by 子句。我怎样才能使 Grand Total 和 Grand Total2 位于底部?
  • 所以我可以通过 desc 订购将 GT2 放在底部。但这并没有改变数据透视函数中的列顺序。
  • 我还把标签改为 Grand Total 没有 2。View 上的创作是在耍花招。现在更改标签名称是一致的,我没有得到不必要的空值。
  • pivot 函数似乎是按升序排列列。如果我将标签更改为“Z”,那么这一列就是最后一列。
  • 不要使用数据透视表。使用传统的group by 查询,其中列是 MAX(表达式然后是字段的情况)。这使您可以完全控制列顺序。

标签: sql oracle oracle11g


【解决方案1】:

我遇到了类似的挑战,我想将数据放在 member1_idmember2_id 中,反之亦然。

我使用ROW_NUMBER() OVER (ORDER BY order_id),而不是在查询末尾使用 ORDER BY 子句。

SELECT * FROM ( 
    SELECT ROW_NUMBER() OVER (ORDER BY order_id) order_col, col1, col2 ...
)
PIVOT (
    MAX(col1) id, MAX(col2) name, ...
    FOR order_col IN (1 col1, 2 col2, ...)
);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-04-10
    • 2012-05-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多