round函数的问题

shangdizhizhang123 2016-09-28 02:52:52
CREATE
VIEW `db1`.`v_bj` AS
SELECT
`s`.`代码` AS `代码`,
`g`.`大类` AS `大类`,
`g`.`中类` AS `中类`,
`g`.`小类` AS `小类`,
`g`.`名称` AS `名称`,
`g`.`单重` AS `单重`,
`g`.`单价` AS `单价`,
`s`.`数量` AS `数量`,
ROUND((`s`.`数量` * `g`.`单重`), 3) AS `重量`,
IF(((`s`.`代码` = 1030300)
OR (`s`.`代码` = 1030900)
OR (`s`.`代码` = 1040200)
OR (`s`.`代码` = 1040500)
OR (`s`.`代码` = 1050300)
OR (`s`.`代码` = 1060101)
OR (`s`.`代码` = 1060102)
OR (`s`.`代码` = 1060103)
OR (`s`.`代码` = 1060300)
OR (`s`.`代码` = 1060400)
OR (`s`.`代码` = 1070300)
OR (`s`.`代码` = 1070303)
OR (`s`.`代码` = 1080400)
OR (`s`.`代码` = 1080500)
OR (`s`.`代码` = 1080600)
OR (`s`.`代码` = 1080700)
OR (`s`.`代码` = 1100600)
OR (`s`.`代码` = 1110200)
OR (`s`.`代码` = 1120200)
OR (`s`.`代码` = 1140600)
OR (`s`.`代码` = 2060000)
OR (`s`.`代码` = 3000000)
OR (`s`.`代码` = 4000000)
OR (`s`.`代码` = 6000000)
OR (`s`.`代码` = 9100000)
OR (`s`.`代码` = 9120000)
OR (`s`.`代码` = 9040000)),
ROUND((`s`.`数量` * `g`.`单价`), 4),
ROUND(((`s`.`数量` * `g`.`单重`) * `g`.`单价`),
4)) AS `金额小计`
FROM
(`db1`.`gygbj3` `g`
JOIN `db1`.`gygbjsl` `s`)
WHERE
(`g`.`代码` = `s`.`代码`)
...全文
878 23 打赏 收藏 转发到动态 举报
写回复
用AI写文章
23 条回复
切换为时间正序
请发表友善的回复…
发表回复
shangdizhizhang123 2016-10-11
  • 打赏
  • 举报
回复
哪位大侠能指导一下?
shangdizhizhang123 2016-09-30
  • 打赏
  • 举报
回复
CREATE TABLE `gygbj3` ( `代码` varchar(8) NOT NULL, `大类` varchar(12) DEFAULT NULL, `中类` varchar(20) DEFAULT NULL, `小类` varchar(20) DEFAULT NULL, `名称` varchar(24) DEFAULT NULL, `单位` varchar(2) DEFAULT NULL, `数量` float(5,1) DEFAULT NULL, `规格及材质` varchar(50) DEFAULT NULL, `单重` double(5,3) DEFAULT NULL, `单价` double(8,5) DEFAULT NULL, `制造商` varchar(48) DEFAULT '', `备注` varchar(67) DEFAULT '', PRIMARY KEY (`代码`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8; insert into gygbj3 values(9990100,'','','','','',3.0,'',3.125,0.95000,'',''); create table gygbjsl as select 代码,数量 from gygbj3; CREATE ALGORITHM = UNDEFINED DEFINER = `root`@`localhost` SQL SECURITY DEFINER VIEW `db1`.`v_bj` AS SELECT `s`.`代码` AS `代码`, `g`.`大类` AS `大类`, `g`.`中类` AS `中类`, `g`.`小类` AS `小类`, `g`.`名称` AS `名称`, `g`.`单重` AS `单重`, `g`.`单价` AS `单价`, `s`.`数量` AS `数量`, ROUND((`s`.`数量` * `g`.`单重`), 3) AS `重量`, IF(((`s`.`代码` = 1030300) OR (`s`.`代码` = 1030900) OR (`s`.`代码` = 1040200) OR (`s`.`代码` = 1040500) OR (`s`.`代码` = 1050300) OR (`s`.`代码` = 1060101) OR (`s`.`代码` = 1060102) OR (`s`.`代码` = 1060103) OR (`s`.`代码` = 1060300) OR (`s`.`代码` = 1060400) OR (`s`.`代码` = 1070300) OR (`s`.`代码` = 1070303) OR (`s`.`代码` = 1080400) OR (`s`.`代码` = 1080500) OR (`s`.`代码` = 1080600) OR (`s`.`代码` = 1080700) OR (`s`.`代码` = 1100600) OR (`s`.`代码` = 1110200) OR (`s`.`代码` = 1120200) OR (`s`.`代码` = 1140600) OR (`s`.`代码` = 2060000) OR (`s`.`代码` = 3000000) OR (`s`.`代码` = 4000000) OR (`s`.`代码` = 6000000) OR (`s`.`代码` = 9100000) OR (`s`.`代码` = 9120000) OR (`s`.`代码` = 9040000)), ROUND((`s`.`数量` * `g`.`单价`), 4), ROUND(((`s`.`数量` * `g`.`单重`) * `g`.`单价`), 4)) AS `金额小计` FROM (`db1`.`gygbj3` `g` JOIN `db1`.`gygbjsl` `s`) WHERE (`g`.`代码` = `s`.`代码`)
ACMAIN_CHM 2016-09-30
  • 打赏
  • 举报
回复
引用 20 楼 shangdizhizhang123 的回复:
我试了,还是不对。 是不是这是一个bug?
贴出你改大后的 create table 语句,配套的 insert 语句。
shangdizhizhang123 2016-09-30
  • 打赏
  • 举报
回复
我试了,还是不对。 是不是这是一个bug?
shangdizhizhang123 2016-09-29
  • 打赏
  • 举报
回复
代码1020100,金额小计9.1627.应该是9.1628才对啊
ACMAIN_CHM 2016-09-29
  • 打赏
  • 举报
回复
IF ( .. OR 可以改成 FIND_IN_SET, 详细可参考MYSQL官方免费手册中的 FIND_IN_SET(str,strlist) 的说明和例子。
ACMAIN_CHM 2016-09-29
  • 打赏
  • 举报
回复
建议楼主按下面相同的方法贴出检查结果,然后明确指出哪个数据没有达到 round的功能。
mysql> select * from gygbj3;
+---------+--------------+--------------+--------------+----------+------+------+------------+-------+--------+--------+------+
| 代码    | 大类         | 中类         | 小类         | 名称     | 单位 | 数量 | 规格及材质 | 单重  | 单价   | 制造商 | 备注 |
+---------+--------------+--------------+--------------+----------+------+------+------------+-------+--------+--------+------+
| 1020100 | 电炉主体设备 | 电极升降系统 | 电极升降系统 | 上把持筒 | 套   |  3.0 | Q235B      | 3.215 | 0.9500 | jz     |      |
+---------+--------------+--------------+--------------+----------+------+------+------------+-------+--------+--------+------+
1 row in set (0.00 sec)

mysql> select * from gygbjsl;
+---------+------+
| 代码    | 数量 |
+---------+------+
| 1020100 |  3.0 |
+---------+------+
1 row in set (0.00 sec)

mysql> select * from v_bj;
+---------+--------------+--------------+--------------+----------+-------+--------+------+-------+----------+
| 代码    | 大类         | 中类         | 小类         | 名称     | 单重  | 单价   | 数量 | 重量  | 金额小计 |
+---------+--------------+--------------+--------------+----------+-------+--------+------+-------+----------+
| 1020100 | 电炉主体设备 | 电极升降系统 | 电极升降系统 | 上把持筒 | 3.215 | 0.9500 |  3.0 | 9.645 |   9.1627 |
+---------+--------------+--------------+--------------+----------+-------+--------+------+-------+----------+
1 row in set (0.01 sec)

mysql>
shangdizhizhang123 2016-09-29
  • 打赏
  • 举报
回复
另外,在建立视图命令中,我想使用in,而不是用这么多的or.如何实现呢?
shangdizhizhang123 2016-09-29
  • 打赏
  • 举报
回复
CREATE ALGORITHM = UNDEFINED DEFINER = `root`@`localhost` SQL SECURITY DEFINER VIEW `db1`.`v_bj` AS SELECT `s`.`代码` AS `代码`, `g`.`大类` AS `大类`, `g`.`中类` AS `中类`, `g`.`小类` AS `小类`, `g`.`名称` AS `名称`, `g`.`单重` AS `单重`, `g`.`单价` AS `单价`, `s`.`数量` AS `数量`, ROUND((`s`.`数量` * `g`.`单重`), 3) AS `重量`, IF(((`s`.`代码` = 1030300) OR (`s`.`代码` = 1030900) OR (`s`.`代码` = 1040200) OR (`s`.`代码` = 1040500) OR (`s`.`代码` = 1050300) OR (`s`.`代码` = 1060101) OR (`s`.`代码` = 1060102) OR (`s`.`代码` = 1060103) OR (`s`.`代码` = 1060300) OR (`s`.`代码` = 1060400) OR (`s`.`代码` = 1070300) OR (`s`.`代码` = 1070303) OR (`s`.`代码` = 1080400) OR (`s`.`代码` = 1080500) OR (`s`.`代码` = 1080600) OR (`s`.`代码` = 1080700) OR (`s`.`代码` = 1100600) OR (`s`.`代码` = 1110200) OR (`s`.`代码` = 1120200) OR (`s`.`代码` = 1140600) OR (`s`.`代码` = 2060000) OR (`s`.`代码` = 3000000) OR (`s`.`代码` = 4000000) OR (`s`.`代码` = 6000000) OR (`s`.`代码` = 9100000) OR (`s`.`代码` = 9120000) OR (`s`.`代码` = 9040000)), ROUND((`s`.`数量` * `g`.`单价`), 4), ROUND(((`s`.`数量` * `g`.`单重`) * `g`.`单价`), 4)) AS `金额小计` FROM (`db1`.`gygbj3` `g` JOIN `db1`.`gygbjsl` `s`) WHERE (`g`.`代码` = `s`.`代码`)
shangdizhizhang123 2016-09-29
  • 打赏
  • 举报
回复
不好意思。刚刚看到,让热心的大侠费心了。 INSERT INTO `db1`.`gygbj3` (`代码`, `大类`,`中类`,`小类`,`名称`,`单位`,`数量`,`规格及材质`,`单重`,`单价`,`制造商`,`备注`) VALUES (1020100,'电炉主体设备','电极升降系统', '电极升降系统','上把持筒','套',3.0,'Q235B',3.215,0.9500,'jz',''); create table gygbjsl as select 代码,数量 from gygbj3;
ACMAIN_CHM 2016-09-29
  • 打赏
  • 举报
回复
引用
`数量` float(5,1) DEFAULT NULL, `单重` double(5,3) DEFAULT NULL, `单价` double(7,4) DEFAULT NULL,
注意这里你的最大小数点设置也就是 7,4 ,改大一些然后再试。
ACMAIN_CHM 2016-09-28
  • 打赏
  • 举报
回复
引用
mysql> desc `gygbj3`; +------------+-------------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +------------+-------------+------+-----+---------+-------+ | 代码 | varchar(8) | NO | PRI | NULL | | | 大类 | varchar(12) | YES | | NULL | | | 中类 | varchar(20) | YES | | NULL | | | 小类 | varchar(20) | YES | | NULL | | | 名称 | varchar(24) | YES | | NULL | | | 单位 | varchar(2) | YES | | NULL | | | 数量 | float(5,1) | YES | | NULL | | | 规格及材质 | varchar(50) | YES | | NULL | | | 单重 | double(5,3) | YES | | NULL | | | 单价 | double(7,4) | YES | | NULL | | | 制造商 | varchar(48) | YES | | | | | 备注 | varchar(67) | YES | | | | +------------+-------------+------+-----+---------+-------+ 12 rows in set (0.02 sec) mysql> INSERT INTO `db1`.`gygbj3` -> (`代码`, -> `大类`, -> `中类`, -> `小类`, -> `名称`, -> `单位`, -> `数量`, -> `规格及材质`, -> `单重`, -> `单价`, -> `制造商`, -> `备注`) -> VALUES -> (1020100,电炉主体设备,电极升降系统, 电极升降系统,上把持筒,套,3.0,Q235B, 3.215,0.9500,jz); ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '电炉主体设备,电极升降系统, 电极升降系统,上' at line 15 mysql>
语法错误,请楼主提供能直接使用的INSERT 语句。
shangdizhizhang123 2016-09-28
  • 打赏
  • 举报
回复
INSERT INTO `db1`.`gygbj3` (`代码`, `大类`, `中类`, `小类`, `名称`, `单位`, `数量`, `规格及材质`, `单重`, `单价`, `制造商`, `备注`) VALUES (1020100,电炉主体设备,电极升降系统, 电极升降系统,上把持筒,套,3.0,Q235B, 3.215,0.9500,jz); create table gygbjsl as select 代码,数量 from gygbj3; 这两个是其实是一个表。
ACMAIN_CHM 2016-09-28
  • 打赏
  • 举报
回复
提供一下没有达到 ROUND((`s`.`数量` * `g`.`单价`), 4), 效果的例子。
ACMAIN_CHM 2016-09-28
  • 打赏
  • 举报
回复
请提供一些测试数据。 insert into ...
shangdizhizhang123 2016-09-28
  • 打赏
  • 举报
回复
CREATE TABLE `gygbj3` ( `代码` varchar(8) NOT NULL, `大类` varchar(12) DEFAULT NULL, `中类` varchar(20) DEFAULT NULL, `小类` varchar(20) DEFAULT NULL, `名称` varchar(24) DEFAULT NULL, `单位` varchar(2) DEFAULT NULL, `数量` float(5,1) DEFAULT NULL, `规格及材质` varchar(50) DEFAULT NULL, `单重` double(5,3) DEFAULT NULL, `单价` double(7,4) DEFAULT NULL, `制造商` varchar(48) DEFAULT '', `备注` varchar(67) DEFAULT '', PRIMARY KEY (`代码`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8; CREATE TABLE `gygbjsl` ( `代码` varchar(8) NOT NULL, `数量` float(5,1) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=utf8; 实际上两个表是一个表,只是为了验证。
shangdizhizhang123 2016-09-28
  • 打赏
  • 举报
回复
windows下,,mysql workchen 6.3
shangdizhizhang123 2016-09-28
  • 打赏
  • 举报
回复
CREATE ALGORITHM = UNDEFINED DEFINER = `root`@`localhost` SQL SECURITY DEFINER VIEW `db1`.`v_bj` AS SELECT `s`.`代码` AS `代码`, `g`.`大类` AS `大类`, `g`.`中类` AS `中类`, `g`.`小类` AS `小类`, `g`.`名称` AS `名称`, `g`.`单重` AS `单重`, `g`.`单价` AS `单价`, `s`.`数量` AS `数量`, ROUND((`s`.`数量` * `g`.`单重`), 3) AS `重量`, IF(((`s`.`代码` = 1030300) OR (`s`.`代码` = 1030900) OR (`s`.`代码` = 1040200) OR (`s`.`代码` = 1040500) OR (`s`.`代码` = 1050300) OR (`s`.`代码` = 1060101) OR (`s`.`代码` = 1060102) OR (`s`.`代码` = 1060103) OR (`s`.`代码` = 1060300) OR (`s`.`代码` = 1060400) OR (`s`.`代码` = 1070300) OR (`s`.`代码` = 1070303) OR (`s`.`代码` = 1080400) OR (`s`.`代码` = 1080500) OR (`s`.`代码` = 1080600) OR (`s`.`代码` = 1080700) OR (`s`.`代码` = 1100600) OR (`s`.`代码` = 1110200) OR (`s`.`代码` = 1120200) OR (`s`.`代码` = 1140600) OR (`s`.`代码` = 2060000) OR (`s`.`代码` = 3000000) OR (`s`.`代码` = 4000000) OR (`s`.`代码` = 6000000) OR (`s`.`代码` = 9100000) OR (`s`.`代码` = 9120000) OR (`s`.`代码` = 9040000)), ROUND((`s`.`数量` * `g`.`单价`), 4), ROUND(((`s`.`数量` * `g`.`单重`) * `g`.`单价`), 4)) AS `金额小计` FROM (`db1`.`gygbj3` `g` JOIN `db1`.`gygbjsl` `s`) WHERE (`g`.`代码` = `s`.`代码`) 这是代码
ACMAIN_CHM 2016-09-28
  • 打赏
  • 举报
回复
建议你列出你的表结构,并提供测试数据以及基于这些测试数据的所对应正确结果。 参考一下这个贴子的提问方式http://bbs.csdn.net/topics/320211382 1. 你的 create table xxx .. 语句 2. 你的 insert into xxx ... 语句 3. 结果是什么样,(并给以简单的算法描述) 4. 你用的数据库名称和版本(经常有人在MS SQL server版问 MySQL) 这样想帮你的人可以直接搭建和你相同的环境,并在给出方案前进行测试,避免文字描述理解上的误差。
rucypli 2016-09-28
  • 打赏
  • 举报
回复
贴出数据啊。。。
加载更多回复(3)

56,677

社区成员

发帖
与我相关
我的任务
社区描述
MySQL相关内容讨论专区
社区管理员
  • MySQL
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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