【发布时间】:2014-01-02 19:36:53
【问题描述】:
我想使用AVG() 函数对数据进行透视,但我想对结果进行四舍五入以防止显示重复的小数。
当我尝试这样的事情时:PIVOT( ROUND( AVG(column_name), 2) FOR ...)
我收到一个错误:ORA-56902: expect aggregate function inside pivot operation
这是一个非常简单的“课程注册学生人数”示例:
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 返回最多 38 位小数通过PIVOT 子句中的AVG() 计算,当数字不均分时的精度?
【问题讨论】:
-
使用内联视图然后舍入?
-
@OldProgrammer 不是一个真正的选择,因为我真的不知道将返回多少列或所有列的名称。
-
你是对的。有趣的问题。
标签: sql oracle oracle11g pivot