oracle 水平透视,Oracle SQL:在多个列/字段上进行透视

我想创建一个表,其中各列的条目“旋转”到列标题.该表用于报告目的 – 我的用户希望通过Excel(使用Microsoft Query)查询数据,问题是在Excel中进行数据透视会使文件变得非常大且速度慢,即使对于中等大小的数据集(~100k数据点)也是如此).

请考虑以下示例:

CREATE TABLE tt

(

"COMMODITY" VARCHAR2(4000 BYTE),"MARKET" VARCHAR2(4000 BYTE),"BID_ASK" VARCHAR2(4000 BYTE),"PRICE" NUMBER

);

INSERT INTO tt VALUES ('Gold','US','Ask',1.1);

INSERT INTO tt VALUES ('Gold','Bid',1);

INSERT INTO tt VALUES ('Gold','EU',1.2);

INSERT INTO tt VALUES ('Gold',1.1);

INSERT INTO tt VALUES ('Oil',11);

INSERT INTO tt VALUES ('Oil',10);

INSERT INTO tt VALUES ('Oil',12);

INSERT INTO tt VALUES ('Oil',11);

我想要实现的输出类似于(确切的列标题并不重要):

COMMODITY 'US_Bid' 'US_Ask' 'EU_Bid' 'EU_Ask'

Gold 1 1.1 1.1 1.2

Oil 10 11 11 12

现在可以直接转动单个列:

SELECT * FROM

(

SELECT * FROM tt

)

PIVOT

(

SUM(PRICE)

FOR MARKET IN ('US','EU')

)

这使:

COMMODITY BID_ASK 'US' 'EU'

Gold Bid 1 1.1

Oil Bid 10 11

Oil Ask 11 12

Gold Ask 1.1 1.2

根据我的研究,没有直接转动多列的语法.有一些相关的问题(here,here或here),但我找不到我的问题的直接答案.所以我想出了以下解决方案:

SELECT * FROM

(

SELECT COMMODITY,CONCAT(CONCAT(MARKET,'_'),BID_ASK) AS MARKET_BID_ASK,PRICE FROM tt

)

PIVOT

(

SUM(PRICE)

FOR MARKET_BID_ASK IN ('US_Bid','US_Ask','EU_Bid','EU_Ask')

)

这产生了完全所需的输出.但是,我不认为它是一个实用的解决方案,因为我必须输入的变量数量增长得太快(在我的真实数据集中,我想一次转动更多字段,所有这些都有许多不同的值).我知道存在dynamic pivots,但我不确定这是否适用于Excel,我也希望保持语法尽可能简单,因为用户将自己定义查询(我只是想提供一个模板)查询他们可以适应).所以我试着查询IN子句中的字段名称:

SELECT * FROM

(

SELECT COMMODITY,PRICE FROM tt

)

PIVOT

(

SUM(PRICE)

FOR MARKET_BID_ASK IN

(

SELECT DISTINCT CONCAT(CONCAT(MARKET,BID_ASK) AS MARKET_BID_ASK FROM tt

)

)

我认为这样的解决方案可能是实用的,因为人们仍然可以约束所查询的变量,而不必使用子查询中的LIKE条件列出所有连接选项.但是,我在这个查询中得到了“ORA-00936 – 缺少表达式”错误,尽管根据我发现的documentation,子查询在这里应该是合法的.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值