代码之家  ›  专栏  ›  技术社区  ›  Malkios

移动小数sql或除法

  •  1
  • Malkios  · 技术社区  · 8 年前

    目前,名单上的最低价格是500英镑

    我需要执行一个查询来更改生产数据库中该列中的所有价格值(备份已完成,因此应该没问题)

    所以500应该是:0.005 14985010应该是:1498501

    我的SQL技能已经非常生疏了,我已经搜索了一段时间,但是找不到正确的答案。任何指针都将非常感谢。谢谢!

    3 回复  |  直到 8 年前
        1
  •  0
  •   Gordon Linoff    8 年前

    您应该首先修复该列,以确保它能够处理适当的小数位。我建议如下:

    alter table t modify column price decimal(38, 10);
    

    然后更新值:

    update t
        price = price / 100000;
    

    select cast(cast(price as decimal(38, 10)) / 100000 as decimal(38, 10))
    

    可能有一些细微的舍入误差不符合您的喜好。

        2
  •  1
  •   Tim Biegeleisen    8 年前

    实际上,我建议不要把你所有的货币数据都除以某个大因素,例如10万元。相反,我建议在你的价格表中添加一个新的列,这是另一个表中的关键,给出了应该用来确定当前价格的因素。所以您可能有这样的设置:

    prices table
    
    price    | factorKey
    500      | 2
    14985010 | 2
    
    factors table
    factorKey | value
    1         | 1
    2         | 0.00001
    

    然后,要生成实际的当前价格,可以执行联接:

    SELECT
        p.price * f.value AS price
    FROM prices p
    INNER JOIN factors f
        ON p.factorKey = f.factorKey;
    

    在此方案下,您只需修改当前系数即可用于价格数据。您甚至可以维护另一个表来跟踪历史价格。提出这一建议的一个原因是,也许贵国政府今后会再次改变价格。对原始数据进行如此大的手动划分/乘法很容易出错。

        3
  •  0
  •   Bill Karwin    8 年前

    首先,货币数据类型应该支持十进制数,而不仅仅是整数。我建议 DECIMAL(12,4) 你的专栏。

    在确定列数据类型可以包含十进制数之后,可以更新表中的所有行。

    下面是演示:

    mysql> create table MyTable ( MyCurrencyColumn decimal(12,4));
    Query OK, 0 rows affected (0.03 sec)
    
    mysql> insert into MyTable values (500), (14985010);
    Query OK, 2 rows affected (0.01 sec)
    Records: 2  Duplicates: 0  Warnings: 0
    
    mysql> select * from MyTable;
    +------------------+
    | MyCurrencyColumn |
    +------------------+
    |         500.0000 |
    |    14985010.0000 |
    +------------------+
    2 rows in set (0.00 sec)
    
    mysql>  UPDATE MyTable SET MyCurrencyColumn = MyCurrencyColumn / 100000;
    Query OK, 2 rows affected (0.02 sec)
    Rows matched: 2  Changed: 2  Warnings: 0
    
    mysql> select * from MyTable;
    +------------------+
    | MyCurrencyColumn |
    +------------------+
    |           0.0050 |
    |         149.8501 |
    +------------------+