【发布时间】: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之后的数据:
这里有两个问题:
- 我希望 Grand Total2 成为最后一列,类似于 Grand Total 是最后一行。
- 我还希望将“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(表达式然后是字段的情况)。这使您可以完全控制列顺序。