如何找到具有字符串和数字值的列的平均值?

时间:2019-01-22 08:45:27

标签: sql oracle

我想计算两列的平均值,但是每列之间都有字符串值,并且在应用avg函数时会产生错误。如何解决此问题?

3 个答案:

答案 0 :(得分:0)

这可能有效

Select (cast(col1 as float) + cast(col2 as float)) / 2 as average_between_col1_and_col2, 
        avg(cast(col2 as float)) as avg_col_2, 
        avg(cast(col1 as float)) as avg_col_1
from table tbl

无论如何,请提供一个完整的示例,其中包含示例数据,您执行的所需结果查询和错误提示。

请注意,我的查询假设两列都不是数字,而是包含数字,如果一列已经是数字,则可以省略强制转换。

答案 1 :(得分:0)

样本数据会有所帮助;我不确定您要“计算两列平均数”是什么意思-是(COLUMN_1 + COLUMN_2) / 2还是AVG(COLUMN_1)AVG(COLUMN_2)

无论如何,原理是相同的-检查列是否包含数字并进行计算。否则,什么都不做。例如:

SQL> with test (col1, col2) as
  2    (select 'a2' , 'ccc' from dual union all
  3     select '100', '200' from dual union all
  4     select '15' , 'xx'  from dual
  5    )
  6  select col1,
  7         col2,
  8         case when regexp_like(col1, '^\d+$') and regexp_like(col2, '^\d+$') then
  9                   (to_number(col1) + to_number(col2)) / 2
 10              else null
 11         end average
 12  from test;

COL COL    AVERAGE
--- --- ----------
a2  ccc
100 200        150
15  xx

SQL>

答案 2 :(得分:0)

如果要在每一列中使用总体平均值,则:

select avg(case when col1 like '^\d+$' then to_number(col1) end) as avg_col1,
       avg(case when col2 like '^\d+$' then to_number(col2) end) as avg_col2
from t;

avg()忽略了NULL值。

如果要在一行中求平均值,则avg()不适用(这是一个聚合函数)。在这种情况下:

select (case when col1 like '^\d+$' and col2 like '^\d+$'
             then ( to_number(col1) + to_number(col2) ) / 2
             when col1 like '^\d+$'
             then to_number(col2)
             when col2 like '^\d+$'
             then to_number(col1)
        end) as avg_col1_2
from t;