格式化数值的问题

jin20000 2009-08-16 10:43:06
请解说一下这是什么原因:
这下面的代码是能运行的.

select '' id,
to_char(sum(Order_MONEY), 'FM99,999,999,990.00') as Order_MONEY,
to_char(sum(Stock_up_MONEY), 'FM99,999,999,990.00') as Stock_up_MONEY,
to_char(sum(RECEIVE_MONEY), 'FM99,999,999,990.00') as RECEIVE_MONEY
from (

select *
from (select t.id as id,
t.ABBR as plat_name,
t.name as platn,
to_char(decode(b.Order_MONEY, null, '0', b.Order_MONEY),
'FM99999999990.00') as Order_MONEY,
to_char(decode(c.Stock_up_MONEY,
null,
'0',
c.Stock_up_MONEY),
'FM99999999990.00') as Stock_up_MONEY,
to_char(decode(d.RECEIVE_MONEY,
null,
'0',
d.RECEIVE_MONEY),
'FM99999999990.00') as RECEIVE_MONEY
from b, c, d, s_supply_plat t
where t.id = c.plat_id(+)
and t.id = d.plat_id(+)
and t.id = b.plat_id(+))
where 1 = 1)


=================================
下面这段是不能运行的,会报"invalid number"错误

select '' id,
to_char(sum(Order_MONEY), 'FM99,999,999,990.00') as Order_MONEY,
to_char(sum(Stock_up_MONEY), 'FM99,999,999,990.00') as Stock_up_MONEY,
to_char(sum(RECEIVE_MONEY), 'FM99,999,999,990.00') as RECEIVE_MONEY
from (

select *
from (select t.id as id,
t.ABBR as plat_name,
t.name as platn,
to_char(decode(b.Order_MONEY, null, '0', b.Order_MONEY),
'FM99,999,999,990.00') as Order_MONEY,
to_char(decode(c.Stock_up_MONEY,
null,
'0',
c.Stock_up_MONEY),
'FM99,999,999,990.00') as Stock_up_MONEY,
to_char(decode(d.RECEIVE_MONEY,
null,
'0',
d.RECEIVE_MONEY),
'FM99,999,999,990.00') as RECEIVE_MONEY
from b, c, d, s_supply_plat t
where t.id = c.plat_id(+)
and t.id = d.plat_id(+)
and t.id = b.plat_id(+))
where 1 = 1)


=======================
以上两段代码的唯一不同就是from里面数值格式化字符串不同,一个是"FM99999999990.00"(用这个不会报错),一个是"FM99,999,999,990.00"(这个会报错),但这两个在最外面都不会有问题,这是为什么呢?????????请帮忙解答一下原因,
...全文
166 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
jin20000 2009-08-31
  • 打赏
  • 举报
回复
oracle 自动转换是不带格式的.OK,
jin20000 2009-08-31
  • 打赏
  • 举报
回复
good
inthirties 2009-08-17
  • 打赏
  • 举报
回复
[Quote=引用楼主 jin20000 的回复:]
请解说一下这是什么原因:
这下面的代码是能运行的.
SQL codeselect'' id,
to_char(sum(Order_MONEY),'FM99,999,999,990.00')as Order_MONEY,
to_char(sum(Stock_up_MONEY),'FM99,999,999,990.00')as Stock_up_MONEY,
to_char(sum(RECEIVE_MONEY),'FM99,999,999,990.00')as RECEIVE_MONEYfrom (select*from (select t.idas id,
t.ABBRas plat_name,
t.nameas platn,
to_char(decode(b.Order_MONEY,null,'0', b.Order_MONEY),'FM99999999990.00')as Order_MONEY,
to_char(decode(c.Stock_up_MONEY,null,'0',
c.Stock_up_MONEY),'FM99999999990.00')as Stock_up_MONEY,
to_char(decode(d.RECEIVE_MONEY,null,'0',
d.RECEIVE_MONEY),'FM99999999990.00')as RECEIVE_MONEYfrom b, c, d, s_supply_plat twhere t.id= c.plat_id(+)and t.id= d.plat_id(+)and t.id= b.plat_id(+))where1=1)

=================================
下面这段是不能运行的,会报"invalid number"错误
SQL codeselect'' id,
to_char(sum(Order_MONEY),'FM99,999,999,990.00')as Order_MONEY,
to_char(sum(Stock_up_MONEY),'FM99,999,999,990.00')as Stock_up_MONEY,
to_char(sum(RECEIVE_MONEY),'FM99,999,999,990.00')as RECEIVE_MONEYfrom (select*from (select t.idas id,
t.ABBRas plat_name,
t.nameas platn,
to_char(decode(b.Order_MONEY,null,'0', b.Order_MONEY),'FM99,999,999,990.00')as Order_MONEY,
to_char(decode(c.Stock_up_MONEY,null,'0',
c.Stock_up_MONEY),'FM99,999,999,990.00')as Stock_up_MONEY,
to_char(decode(d.RECEIVE_MONEY,null,'0',
d.RECEIVE_MONEY),'FM99,999,999,990.00')as RECEIVE_MONEYfrom b, c, d, s_supply_plat twhere t.id= c.plat_id(+)and t.id= d.plat_id(+)and t.id= b.plat_id(+))where1=1)

=======================
以上两段代码的唯一不同就是from里面数值格式化字符串不同,一个是"FM99999999990.00"(用这个不会报错),一个是"FM99,999,999,990.00"(这个会报错),但这两个在最外面都不会有问题,这是为什么呢?????????请帮忙解答一下原因,
[/Quote]


在你的子查询中
使用了
to_char(decode(b.Order_MONEY,null,'0', b.Order_MONEY),'FM99,999,999,990.00')as Order_MONEY,

所以这里已经是转成了带,的字符串,然后最外层的sum(Order_MONEY) 当然就出错了哟

你这里可以在子查询里不做格式的转换,在最外层做完统计以后,在进行to_char(sum(Order_MONEY),'FM99,999,999,990.00')的格式的转换
zhangwonderful 2009-08-17
  • 打赏
  • 举报
回复
完全同意9楼的说法,在最外层做格式化处理就可以了。里层to_char并格式化后增加了字符',',就变成字符,再对包含','的字符串进行sum肯定出错。
cosio 2009-08-16
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 wildwave 的回复:]
引用 2 楼 jin20000 的回复:
因为我只是要知道"一个是"FM99999999990.00"(用这个不会报错),一个是"FM99,999,999,990.00"(这个会报错),这两个在from里面和外面怎么会有不同的效果的"

那是当然了
你的聚合函数用的是sum
这个函数是对数字而言的,如果或者其一是字符型,其他都是Null才行
FM99999999990.00
用这个的话,虽然是字符型,可是里面的值是纯数字,系统会自动进行隐式转换来实行sum
但如果多个逗号,系统就没法转换成数值,自然sum()会出错
[/Quote]

解释同上
心客路客 2009-08-16
  • 打赏
  • 举报
回复
你用了聚合函数sum(),这个函数是要传NUMBER型参数的。当然对与正常的9999.0这样的字符串,Oracle是可以自行转换成number。但对于999,999.0这样的字符串就Oracle自己的转型就不能用了。所以报会报"invalid number"错误 .
shiyiwan 2009-08-16
  • 打赏
  • 举报
回复
decode(b.Order_MONEY, null, '0', b.Order_MONEY),
像这种写法里面的'0'改成0就可以了

目前是字符格式,当然报无效数字的错啦
小灰狼W 2009-08-16
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 jin20000 的回复:]
因为我只是要知道"一个是"FM99999999990.00"(用这个不会报错),一个是"FM99,999,999,990.00"(这个会报错),这两个在from里面和外面怎么会有不同的效果的"
[/Quote]
那是当然了
你的聚合函数用的是sum
这个函数是对数字而言的,如果或者其一是字符型,其他都是Null才行
FM99999999990.00
用这个的话,虽然是字符型,可是里面的值是纯数字,系统会自动进行隐式转换来实行sum
但如果多个逗号,系统就没法转换成数值,自然sum()会出错
jin20000 2009-08-16
  • 打赏
  • 举报
回复
各位大虾,赶快现身吧!,帮小弟解答一下
jin20000 2009-08-16
  • 打赏
  • 举报
回复
因为我只是要知道"一个是"FM99999999990.00"(用这个不会报错),一个是"FM99,999,999,990.00"(这个会报错),这两个在from里面和外面怎么会有不同的效果的"
jin20000 2009-08-16
  • 打赏
  • 举报
回复
请帮忙解答一下原因,改SQL之类的就不用说了
xiaozejun 2009-08-16
  • 打赏
  • 举报
回复
这个问题正在学习中 过来向高手学习学习 帮顶 楼主解决问题后 请记得把解决的方法详细说一下 让我们也好好学习

17,377

社区成员

发帖
与我相关
我的任务
社区描述
Oracle 基础和管理
社区管理员
  • 基础和管理社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧