gpt4 book ai didi

sql - Oracle SQL : Pivot on multiple columns/fields

转载 作者:行者123 更新时间:2023-12-04 15:57:38 25 4
gpt4 key购买 nike

我想创建一个表,其中各个列的条目“旋转”到列标题。该表用于报告目的 - 我的用户希望通过 Excel(使用 Microsoft Query)查询数据,问题是在 Excel 中进行数据透视会使文件变得不切实际,即使对于中等大小的数据集(约 10 万个数据点) )。

考虑以下示例:

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','US','Bid',1);
INSERT INTO tt VALUES ('Gold','EU','Ask',1.2);
INSERT INTO tt VALUES ('Gold','EU','Bid',1.1);
INSERT INTO tt VALUES ('Oil','US','Ask',11);
INSERT INTO tt VALUES ('Oil','US','Bid',10);
INSERT INTO tt VALUES ('Oil','EU','Ask',12);
INSERT INTO tt VALUES ('Oil','EU','Bid',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

根据我的研究,没有直接旋转多列的语法。有一些相关的问题( hereherehere ),但我在那里找不到我的问题的直接答案。所以我想出了以下解决方案:
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, CONCAT(CONCAT(MARKET,'_'),BID_ASK) AS MARKET_BID_ASK, 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 子查询在这里应该是合法的我发现的。

最佳答案

您可以通过将列和值集括在括号中来对多列进行透视:

SELECT * FROM
(
SELECT * FROM tt
)
PIVOT
(
SUM(PRICE)
FOR (MARKET, BID_ASK)
IN (('US', 'Bid') us_bid, ('US', 'Ask') us_ask, ('EU', 'Bid') eu_bid, ('EU', 'Ask') eu_ask)
);

COMMODITY US_BID US_ASK EU_BID EU_ASK
---------- ---------- ---------- ---------- ----------
Gold 1 1.1 1.1 1.2
Oil 10 11 11 12

但是在解析查询时仍然必须知道值对,如果你有很多值的组合,这不能很好地扩展。

正如您所怀疑的,您唯一的选择是动态 SQL,除非您可以让 Excel 处理 XML 数据透视的结果 - 我认为这是不可能的。使用动态 SQL,如果 Excel 发现比数据透视查询更容易处理,您可能会拥有一个执行查询和数据透视并返回引用游标的函数。

关于sql - Oracle SQL : Pivot on multiple columns/fields,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38696067/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com