gpt4 book ai didi

sql - 有没有办法舍入 Oracle 交叉表 PIVOT?

转载 作者:行者123 更新时间:2023-12-02 01:07:28 25 4
gpt4 key购买 nike

我想使用 AVG() 函数对数据进行透视,但我想对结果进行舍入以防止显示重复的小数。

当我尝试这样的操作时:PIVOT( ROUND( AVG(column_name), 2) FOR ...)

我收到一个错误:ORA-56902: expect aggregate function inside pivot operation

这是一个非常简单的“注册类(class)的学生人数”的例子:

CREATE TABLE TBL_EXAMPLE
(
enrolled NUMBER,
course VARCHAR2(50 CHAR)
);

INSERT INTO TBL_EXAMPLE (enrolled, course) VALUES (1, 'math');
INSERT INTO TBL_EXAMPLE (enrolled, course) VALUES (2, 'math');
INSERT INTO TBL_EXAMPLE (enrolled, course) VALUES (2, 'math');
INSERT INTO TBL_EXAMPLE (enrolled, course) VALUES (1, 'english');
INSERT INTO TBL_EXAMPLE (enrolled, course) VALUES (4, 'english');

SELECT *
FROM TBL_EXAMPLE
PIVOT ( AVG(enrolled) FOR course IN ('math', 'english') );

'math' 'english'
---------------|-------------
1.6666666666...| 2.5

我想要的是:

SELECT * 
FROM TBL_EXAMPLE
PIVOT ( ROUND(AVG(enrolled), 2) FOR course IN ('math', 'english') );

'math' 'english'
---------------|-------------
1.67 | 2.50

在现实世界的应用程序中,SQL 是根据用户在报表上的输入动态生成的,由于现实世界场景的复杂性,我不能像这样重写查询:

SELECT ROUND("'math'", 2) as "'math'", ROUND("'english'", 2) as "'english'"
FROM TBL_EXAMPLE
PIVOT ( AVG(enrolled) FOR course IN ('math', 'english') );

所以,我的问题是,在这种情况下,我是否可以使用任何解决方法来绕过 ORA-56902,或者使用任何其他方法来“欺骗”Oracle NOT通过 PIVOT 子句中的 AVG() 计算,当数字不能均分时返回最多 38 位小数精度?

最佳答案

也许我遗漏了什么,但为什么不在带有 ROUND 的子查询中执行 AVG(),然后应用您的 PIVOT:

select *
from
(
select round(avg(enrolled), 2) enrolled, course
from tbl_example
group by course
) d
PIVOT
(
max(enrolled)
FOR course IN ('math', 'english')
);

参见 SQL Fiddle with Demo

关于sql - 有没有办法舍入 Oracle 交叉表 PIVOT?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20890463/

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