移动小数sql或除

时间:2018-08-19 02:24:56

标签: mysql sql laravel

我使用mysql在Laravel中为我的办公室构建了一个管理系统,其中一个主要表格是产品价格的两倍。该系统已经投入生产2年多了,但是这里的政府更改了我们的货币并删除了5个零,因此我需要更改所有价格值,同时保留一些小数。

当前,列表中的最低价格是500 而最高的是14985010

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

因此500个应为:0.005 而14985010应该是:149.8501

我认为所需要做的就是将值除以100000,但我可能是错的。

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

3 个答案:

答案 0 :(得分:1)

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

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;

在此方案下,您只需修改要与价格数据一起使用的当前系数。您甚至可以维护另一个表来跟踪历史价格。建议这样做的原因之一是,也许您的政府将来会再次改变价格。在原始数据上进行如此大的手动除法/乘法操作很容易出错。

答案 1 :(得分:0)

首先,您的货币数据类型应支持十进制数字,而不仅仅是整数。我建议您在专栏中使用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 |
+------------------+

答案 2 :(得分:0)

您应该首先修复该列,以确保它可以处理适当的小数位。我建议像这样:

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))

可能有一些您不喜欢的细微舍入错误。