【问题标题】:Is there a way to round an Oracle crosstab PIVOT?有没有办法舍入 Oracle 交叉表 PIVOT?
【发布时间】: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


【解决方案1】:

也许我遗漏了一些东西,但为什么不在带有 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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-03-23
    • 2022-07-19
    • 1970-01-01
    • 2017-02-15
    • 1970-01-01
    • 1970-01-01
    • 2012-03-09
    相关资源
    最近更新 更多