MySQL中的CAST转换为DECIMAL

47

我试图在MySQL中执行Decimal类型转换,方法如下:

CAST((COUNT(*) * 1.5) AS DECIMAL(2))

我正在尝试将表格中的行数(乘以1.5)转换为带有两位小数的浮点数。

SQL代码:

 SELECT CONCAT(Guardian.title, ' ', 
               Guardian.forename, ' ', 
               Guardian.surname) AS 'Guardian Name', 
               COUNT(*) AS 'Number of Activities', 
               (COUNT(*) * 1.5) AS 'Cost'
 FROM Schedule
 INNER JOIN Child ON Schedule.child_id = Child.id
 INNER JOIN Guardian ON Child.guardian = Guardian.id
 GROUP BY Guardian
 ORDER BY Guardian.surname, Guardian.forename ASC

它产生了一个错误:

#1064 - 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 'CAST((COUNT(*) * 1.5) AS DECIMAL(12,2))' at line 1.

再试一次,这个强制类型转换也不起作用:

 SELECT CONCAT(Guardian.title, ' ', 
               Guardian.forename, ' ', 
               Guardian.surname) AS 'Guardian Name', 
               COUNT(*) AS 'Number of Activities', 
               CAST((COUNT(*) * 1.5) AS DECIMAL(8,2)) AS 'Cost'
 FROM Schedule
 INNER JOIN Child ON Schedule.child_id = Child.id
 INNER JOIN Guardian ON Child.guardian = Guardian.id
 GROUP BY Guardian
 ORDER BY Guardian.surname, Guardian.forename ASC

如何使用mysql将整数转为小数?


1
你遇到了什么问题?你有具体的错误信息或结果显示出了问题吗? - Holger Brandt
#1064 - SQL语法错误;请检查与您的MySQL服务器版本相对应的手册,以了解在第1行使用正确的语法,CAST((COUNT(*) * 1.5) AS DECIMAL(12,2))。 - Ben
我已经查看了文档,但不知道为什么我的代码无法工作 :S - Ben
展示整个代码,而不仅仅是一行。这个SQL-Fiddle运行良好。 - ypercubeᵀᴹ
GROUP BY Guardian ??? Guardian 是一张表吧?不应该写成 GROUP BY Guardian.id 吗? - ypercubeᵀᴹ
显示剩余2条评论
5个回答

41

根据MySQL文档:固定点类型(精确值) - DECIMAL, NUMERIC:

在标准SQL中,语法DECIMAL(M)等价于DECIMAL(M,0)

因此,你正在将其转换为具有2个整数位和0个小数位的数字。请改用以下方法:

CAST((COUNT(*) * 1.5) AS DECIMAL(12,2)) 

谢谢,虽然我已经尝试过了,但是仍然出现以下错误:#1064 - 您的SQL语法有误;请检查与您的MySQL服务器版本相对应的手册,以获取正确的语法使用方式,例如'DECIMAL(12,2)) AS 'Cost'。 - Ben
@Ben:那里不要使用单引号:AS 'Cost'。请使用:AS Cost - ypercubeᵀᴹ
谢谢,但是当我删除引号时仍然出现错误。 - Ben

36

MySQL转换为十进制数:

将裸整数转换为十进制数:

select cast(9 as decimal(4,2));       //prints 9.00

将8/5的整数转换为十进制:

select cast(8/5 as decimal(11,4));    //prints 1.6000

将字符串转换为十进制数:

select cast(".885" as decimal(11,3));   //prints 0.885

将两个整数变量转换为十进制数

mysql> select 5 into @myvar1;
Query OK, 1 row affected (0.00 sec)

mysql> select 8 into @myvar2;
Query OK, 1 row affected (0.00 sec)

mysql> select @myvar1/@myvar2;   //prints 0.6250

将十进制数转换回字符串:
select cast(1.552 as char(10));   //shows "1.552"

12

DECIMAL 有两个部分: PrecisionScale。所以你的查询语句的一部分将是这样的:

CAST((COUNT(*) * 1.5) AS DECIMAL(8,2))

Precision 表示存储值时所保存的有效数字个数。
Scale 表示小数点后可以存储的数字位数。


3

我很懒:

0 + colname

此外,这适用于任何小数位数、浮点数等固定格式。另请参见ROUND()FORMAT()

2

我认为对于你的目的,另一种选择是使用round()函数:

select round((10 * 1.5),2) // prints 15.00

你可以在这里尝试一下:

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接