我有这样一张table:
| 第1类|价格A|价格B|类型1|第2类|成本A|成本B|第2类|
| - ------|- ------|- ------|- ------|- ------|- ------|- ------|- ------|
| 联合 Realm |五十五|七十|十|加拿大|二十五|十五|Z型|
| 联合 Realm |三十|二十六|是|印度|二十个|二十个|Z型|
| 新西兰|三十八|三十六|Z型|格尔|四十|二十五|是|
| 美国|四十七|四十九|Z型|澳大利亚|六十|十五|十|
我需要在不使用UNION
或UNION ALL
的情况下获得如下所示的内容
| 第三类|总A|总B|类型|
| - ------|- ------|- ------|- ------|
| 联合 Realm |五十五|七十|十|
| 联合 Realm |三十|二十六|是|
| 新西兰|三十八|三十六|Z型|
| 美国|四十七|四十九|Z型|
| 加拿大|二十五|十五|Z型|
| 印度|二十个|二十个|Z型|
| 格尔|四十|二十五|是|
| 澳大利亚|六十|十五|十|
我没有创建过程的权限,所以没有PL/SQL
。有什么方法可以在Oracle
中不使用以下代码来创建过程?
select cat1, priceA, priceB, type1
UNION ALL
select cat2,costA,costB,type2
编辑:
对于两列表格,如下所示:
| 第1类|第2类|
| - ------|- ------|
| 联合 Realm |加拿大|
| 联合 Realm |印度|
| 新西兰|格尔|
| 美国|澳大利亚|
要得到这个:
| 第三类|
| - ------|
| 联合 Realm |
| 联合 Realm |
| 新西兰|
| 美国|
| 加拿大|
| 印度|
| 格尔|
| 澳大利亚|
我可以用这个:
SELECT
cat3
FROM
(
SELECT cat1, cat2 AS cat3
WHERE <conditions>
) T UNPIVOT (cat3 FOR COL IN (cat1, cat2))
但是如何对多列进行此操作呢?
2条答案
按热度按时间2cmtqfgy1#
可以以
cross join
语句开始,以case..when
语句结束,如下所示:Demo
b91juud32#
取消透视的有效方法是:
我不知道这是否违反了
union all
的奇怪限制,但这也可以表述为:在Oracle 12C中,横向连接是可行的方法(尽管这仍然需要
union all
:最后,
union all
可以满足CTE:如果优化器认为CTE是最佳方法,Oracle将实现CTE,从而消除性能问题。