找回密码
 立即注册
搜索
查看: 3332|回复: 31

[软件] 咨询个sql问题,关于货币单位转换

[复制链接]
     
发表于 2022-8-24 19:57 来自手机 | 显示全部楼层 |阅读模式
用的sql server,表里有个字段是价格,但单位不一,比如“200人民币”,下一条个就是“50美元”这样,有好多种单位。有什么方法能统一成人民币呢?就按现时汇率就行。最好是直接在软件里做。
眼下能想出的唯一办法就是全导出来用python处理然后再倒进去,但一共有几千万条,sql server导出好像会全读到内存再写成文件,上次导几百万条,64g内存就满了,然后电脑闪屏死机…
回复

使用道具 举报

     
发表于 2022-8-24 20:00 | 显示全部楼层
可以试着用sql语句,根据币种update,不同币种 * 不同的汇率,可以手写汇率
常用的币种可能也就10来个吧,大概10来条就可以了,可以新增一个字段检查是否更新过,最后对没更新的条目手工再UPDATE
回复

使用道具 举报

     
 楼主| 发表于 2022-8-24 20:18 来自手机 | 显示全部楼层
chachi 发表于 2022-8-24 20:00
可以试着用sql语句,根据币种update,不同币种 * 不同的汇率,可以手写汇率
常用的币种可能也就10来个吧, ...

但是字段里数字和汉字部分的长度都不一样,我只会left right…
提取出纯数字和汉字的语句该怎么写呢?

—— 来自 Xiaomi M2011K2C, Android 12上的 S1Next-鹅版 v2.5.4
回复

使用道具 举报

     
发表于 2022-8-24 20:41 | 显示全部楼层
gx19860411 发表于 2022-8-24 20:18
但是字段里数字和汉字部分的长度都不一样,我只会left right…
提取出纯数字和汉字的语句该怎么写呢?

你可能需要正则表达式. Python 标准库里的 re 模块

—— 来自 S1Fun
回复

使用道具 举报

头像被屏蔽
     
发表于 2022-8-24 20:42 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
回复

使用道具 举报

     
 楼主| 发表于 2022-8-24 20:44 来自手机 | 显示全部楼层
すぴぱら 发表于 2022-8-24 20:42
用python连接数据库查询之后更新进去不行吗?
不用把整张表导出吧

还真没想到这个路子,我搜搜去

—— 来自 Xiaomi M2011K2C, Android 12上的 S1Next-鹅版 v2.5.4
回复

使用道具 举报

     
发表于 2022-8-24 20:53 来自手机 | 显示全部楼层
即使全导出来也是只导主键和钱这列两列,处理后根据主键逐一update回去都行。
回复

使用道具 举报

     
 楼主| 发表于 2022-8-24 21:19 来自手机 | 显示全部楼层
听剑客 发表于 2022-8-24 20:53
即使全导出来也是只导主键和钱这列两列,处理后根据主键逐一update回去都行。 ...

这样应该会小很多,明天试试

—— 来自 Xiaomi M2011K2C, Android 12上的 S1Next-鹅版 v2.5.4
回复

使用道具 举报

     
发表于 2022-8-24 23:07 | 显示全部楼层
感觉你可以写 case when price like '%美元%'
then  replace(price,'美元','') * 美元汇率 -- 把中文删了就好了XD
when ...
这种
回复

使用道具 举报

     
 楼主| 发表于 2022-8-24 23:13 来自手机 | 显示全部楼层
帆影FX 发表于 2022-8-24 23:07
感觉你可以写 case when price like '%美元%'
then  rep ...

超赞

—— 来自 Xiaomi M2011K2C, Android 12上的 S1Next-鹅版 v2.5.4
回复

使用道具 举报

     
 楼主| 发表于 2022-8-25 12:13 来自手机 | 显示全部楼层
帆影FX 发表于 2022-8-24 23:07
感觉你可以写 case when price like '%美元%'
then  rep ...

处理完结果全是NULL

—— 来自 Xiaomi M2011K2C, Android 12上的 S1Next-鹅版 v2.5.4
回复

使用道具 举报

     
发表于 2022-8-25 13:31 | 显示全部楼层
gx19860411 发表于 2022-8-25 12:13
处理完结果全是NULL

—— 来自 Xiaomi M2011K2C, Android 12上的 S1Next-鹅版 v2.5.4 ...

你是不是没用cast把字符串转成数字啊,我这个就是个大概的例子
回复

使用道具 举报

     
发表于 2022-8-25 13:35 | 显示全部楼层
SELECT cast(replace('50美元','美元','') as int)  *6.8 FROM demo;
这个我试了在SQL Server里面是能跑的
回复

使用道具 举报

     
发表于 2022-8-25 13:59 来自手机 | 显示全部楼层
应该把这个字段拆开 一个金额 一个币种

—— 来自 HUAWEI JAD-AL50, Android 10上的 S1Next-鹅版 v2.5.4
回复

使用道具 举报

     
发表于 2022-8-25 14:09 | 显示全部楼层
这种功能一般是程序处理的吧
数据量大就分批次处理呗
回复

使用道具 举报

     
发表于 2022-8-25 14:37 | 显示全部楼层
汇率呢。。。
原始数据不要动,调数据的地方实时处理吧。
回复

使用道具 举报

     
发表于 2022-8-25 21:27 来自手机 | 显示全部楼层
新建2个字段吧,一个金额一个币种,用程序处理,sql反而慢。
回复

使用道具 举报

     
发表于 2022-8-26 15:54 | 显示全部楼层
看情况一次查询100/1000/10000条记录,哪有把所有记录都查到内存里再处理的
回复

使用道具 举报

     
发表于 2022-8-26 16:13 | 显示全部楼层
这肯定得加个币种的字段了,然后再增加个金额字段和cny字段,连一个汇率表,把数update到cny字段里
回复

使用道具 举报

     
发表于 2022-8-26 16:19 | 显示全部楼层
SQL咋写我不会
但是 Python 的话
单台机器按照 id 起几个进程手动分下片
Python 多进程按照 分片 去读记录,每次读取 limit 1000, 1000个内容记录在内存里,处理结束了一次性写入减少IO

当然你也可以给我一个夜宵钱我帮你写(
回复

使用道具 举报

     
 楼主| 发表于 2022-8-26 19:49 来自手机 | 显示全部楼层
zdn 发表于 2022-8-26 16:13
这肯定得加个币种的字段了,然后再增加个金额字段和cny字段,连一个汇率表,把数update到cny字段里 ...

请问我看不少都说要update,为啥不是
select A.*, B.CNY
into C
where A.ID=B.ID
呢?

—— 来自 Xiaomi M2011K2C, Android 12上的 S1Next-鹅版 v2.5.4
回复

使用道具 举报

     
发表于 2022-8-26 23:04 | 显示全部楼层
也可以 再整个表用id连
回复

使用道具 举报

     
发表于 2022-8-26 23:50 | 显示全部楼层
回复

使用道具 举报

发表于 2022-8-27 02:23 | 显示全部楼层
SELECT
PATINDEX('%[^0-9.]%',price),
STUFF(price,PATINDEX('%[^0-9.]%',price),LEN(price),'') + '人民币'
FROM
item

随便写的(
几千万条估计跑不起来
为了未来着想建议还是把数字和单位分开来搞成俩列(
回复

使用道具 举报

发表于 2022-8-27 02:24 | 显示全部楼层
本帖最后由 ballban 于 2022-8-27 02:25 编辑

风怒
回复

使用道具 举报

     
 楼主| 发表于 2022-8-27 11:49 来自手机 | 显示全部楼层
已经用python把导出的id和价格字段转成人民币了,可导入sql后update好慢啊…已经跑一夜了…

—— 来自 Xiaomi M2011K2C, Android 12上的 S1Next-鹅版 v2.5.4
回复

使用道具 举报

     
发表于 2022-8-27 12:27 | 显示全部楼层
gx19860411 发表于 2022-8-27 11:49
已经用python把导出的id和价格字段转成人民币了,可导入sql后update好慢啊…已经跑一夜了…

—— 来自 Xia ...

如果你那个表平时有查询和插入,数据量再一大,直接update不大好
回复

使用道具 举报

头像被屏蔽
     
发表于 2022-8-27 14:26 来自手机 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
回复

使用道具 举报

     
 楼主| 发表于 2022-8-27 18:43 来自手机 | 显示全部楼层
精钢魔像 发表于 2022-8-27 12:27
如果你那个表平时有查询和插入,数据量再一大,直接update不大好

已经跑了19个小时了

—— 来自 Xiaomi M2011K2C, Android 12上的 S1Next-鹅版 v2.5.4
回复

使用道具 举报

     
发表于 2022-8-27 18:52 来自手机 | 显示全部楼层
你这对汇率的要求,到时候追溯数据怎么办?两手一摊怪领导咯?

— from OPPO PEGM00, Android 12 of S1 Next Goose v2.5.4
回复

使用道具 举报

     
 楼主| 发表于 2022-8-27 19:04 来自手机 | 显示全部楼层
super_uni 发表于 2022-8-27 18:52
你这对汇率的要求,到时候追溯数据怎么办?两手一摊怪领导咯?

— from OPPO PEGM00, Android 12 o ...

原字段留着呢

—— 来自 Xiaomi M2011K2C, Android 12上的 S1Next-鹅版 v2.5.4
回复

使用道具 举报

     
发表于 2022-8-27 23:10 | 显示全部楼层
gx19860411 发表于 2022-8-27 18:43
已经跑了19个小时了

—— 来自 Xiaomi M2011K2C, Android 12上的 S1Next-鹅版 v2.5.4 ...

不知你的表是怎么样的,我建议把要改的数据先放另一个表,再用个字段标记是否更新,每几百行提交一次
有中间表的数据,改完后写sql检查也容易些
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|小黑屋|上海互联网违法和不良信息举报中心|网上有害信息举报专区|962110 反电信诈骗|举报电话 021-62035905|Stage1st ( 沪ICP备13020230号-1|沪公网安备 31010702007642号 )

GMT+8, 2024-11-15 03:23 , Processed in 0.171185 second(s), 5 queries , Gzip On, Redis On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表