我正在尝试编写一个用于Excel 2013宏的SQL。 我的目标是根据相关字段的值返回某些数字的平均值。
我的问题是有些数字包含>在第一个字符处签名。我一直试图用SQL检测并忽略>签名,因为我需要将数字包含在返回的平均值中(不能只是扔掉实例)。
最后,我无法更改数据,我们的管理员必须保持完整(即使数据管理不佳)。
以下是我发出的错误:
animation-duration
当数据不包含> (比如> 10000)没有问题,它就像一个冠军。 当数据包含>我收到错误ORA-01722:无效号码
我试图将字段中的数据转换为十进制,但它也会抛出错误:
SELECT AVG(CASE WHEN data.study = 'studyname' THEN data.result ELSE NULL END)
FROM database data
WHERE data.ID = '12345'
这给了我同样的错误。 我试图使用LEFT函数来确定最左边的char是否是>但我似乎无法正确理解语法,而且在线示例不属于AVG()函数内部或要求我重写数据。我现在只使用SQL一两个星期,所以它可能是一个非常简单的东西,我忽略了。
感谢您的时间和帮助!
答案 0 :(得分:0)
检查该值是否为有效数字。这可能足以满足您的目的:
SELECT AVG(CASE WHEN data.study = 'studyname' AND
REGEXP_LIKE(data.result, '^[0-9]{0-3}[.]?[0-9]{0-9}$')
THEN CAST(data.result AS DECIMAL(3, 9)
END)
FROM database data
WHERE data.ID = '12345'
答案 1 :(得分:0)
您可能需要检查/更改excel中的列格式,从常规格式到数字格式,然后尝试。
通用格式可能会为您提供可能导致错误的指数值。
我希望这可能有所帮助。
答案 2 :(得分:0)
LEFT函数的语法是LEFT([列名],字符数)。
你可以尝试
AVG(CAST(解码)(左([你的专栏],1),'>',SUBSTR([你的专栏],2,len([你的列]],[你的列])AS DECIMAL(3,9) )))
DECODE提供条件逻辑。因此,如果第一个字符是>然后使用除第一个字符以外的所有内容,否则使用整个内容。
或使用REPLACE功能。
AVG(CAST(REPLACE([你的专栏],'>','')AS DECIMAL(3,9)))