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