wwe*_*ker 2 sql oracle pivot oracle11g
我想使用该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
Run Code Online (Sandbox Code Playgroud)
我想要的是:
SELECT *
FROM TBL_EXAMPLE
PIVOT ( ROUND(AVG(enrolled), 2) FOR course IN ('math', 'english') );
'math' 'english'
---------------|-------------
1.67 | 2.50
Run Code Online (Sandbox Code Playgroud)
在现实世界的应用程序中,SQL是基于报表上的用户输入动态生成的,由于现实世界场景的复杂性,我不能像这样重写查询:
SELECT ROUND("'math'", 2) as "'math'", ROUND("'english'", 2) as "'english'"
FROM TBL_EXAMPLE
PIVOT ( AVG(enrolled) FOR course IN ('math', 'english') );
Run Code Online (Sandbox Code Playgroud)
所以,我的问题是,有没有什么解决办法,我可以使用绕过ORA-56902在这种情况下,或任何其他方式"绝招"甲骨文成不回国高达小数精度38位数字时,不通过均分AVG()的计算PIVOT条款?
也许我错过了一些东西,但为什么不在AVG()a子查询中执行a ROUND然后应用你的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')
);
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1948 次 |
| 最近记录: |