【问题标题】:Round the average in oracle在 oracle 中取平均值
【发布时间】:2022-01-17 22:06:41
【问题描述】:

我在数据库中有这些值:

Sno values avg
1 0.06 0.06
2 5.0 5
3 7.0 7
4 25.0 25
5 24 24

我能够使用以下方法将值四舍五入到小数点后两位:

ceil((AVG( value ) )*100)/100 as avgs

如果我们有更多数据,那是正确的,但如果我们对每个 sno 都有一个值,那么平均值也应该是这样的:

avg
0.06
5.0
7.0
25.0
24

我们该如何处理呢? 谁能帮我解决这个问题?

【问题讨论】:

  • edit 包含minimal reproducible example 的问题:CREATE TABLE 为您的表声明;示例数据的 INSERT 语句; YOUR 尝试 SQL 语句(完整的语句而不是单个表达式);问题的英文描述; 您的解决方案的问题/错误;以及该样本数据的预期输出。
  • 您的意思是您希望小数点后至少有一个零 - 在您的示例的最后一行中您没有 24 吗?如果是这样,那是格式问题,而不是计算问题。还是您想完全保留您在 values 中显示的内容 - 暗示这是一个字符串,而不是数字,并且您的计算依赖于隐式转换?
  • 目前还不清楚您要解决什么问题,因为预期的输出看起来与数据库中的值完全相同,除了 .0 附加到某些值(但不是全部其中)。
  • 如果你取平均值,那么输入必须是数字,而不是字符串。如果它们是数字,您如何在同一列中显示 25.0 和 24?甚至不要考虑您的任何计算 - 只需查看您的输入列,称为 values。当然,作为一个数字,25.0和25是一样的,一个数字列只能以一种格式显示。在你问一个关于“平均”和“四舍五入”的问题之前,整个事情都是没有意义的。

标签: sql oracle


【解决方案1】:

假设这些值是字符串。

如果只有一个,则显示 MAX 而不是 AVG。

create table test (
 sno number, 
 value varchar2(12)
);
insert into test (sno, value)
select 1 sno, '0.06' value from dual union all
select 2, '5.0' from dual union all
select 3, '7.0' from dual union all
select 4, '25.02' from dual union all
select 9, '4321.12' from dual union all
select 9, '1234.21' from dual union all
select 5, '24' from dual;
select sno
, case
  when count(value) = 1 then max(value)
  else to_char(round(avg(value), 2)) 
  end as "avg" 
from test t
group by sno
SNO avg
9 2777.67
2 5.0
4 25.02
3 7.0
5 24
1 0.06

db小提琴here

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-11-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-06-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多