有没有办法绕过Oracle交叉表PIVOT?

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条款?

Tar*_*ryn 5

也许我错过了一些东西,但为什么不在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)

请参阅SQL Fiddle with Demo