Mysql 数据在列中被截断错误,可能是类型错误,如何避免?

Mysql 数据在列中被截断错误,可能是类型错误,如何避免?,mysql,runtime-error,rounding,type-conversion,sqldatatypes,Mysql,Runtime Error,Rounding,Type Conversion,Sqldatatypes,我正在做一个汇总表,在这里我创建了一个按平均值聚合的新表。此处显示的小示例: CREATE TABLE PURCHASES (U_ID INT, TIMECODE TINYINT, PURCHASEVALUE INT); INSERT INTO PURCHASES VALUES (3399, 1, 10), (3399, 2, 20), (2222, 2, 20), (2222, 2, 30), (6644, 1, 10), (6644, 1, 30), (664

我正在做一个汇总表,在这里我创建了一个按平均值聚合的新表。此处显示的小示例:

CREATE   TABLE PURCHASES (U_ID INT,  TIMECODE TINYINT, PURCHASEVALUE INT);
INSERT INTO PURCHASES VALUES 
    (3399, 1, 10), (3399, 2, 20),
    (2222, 2, 20), (2222, 2, 30),
    (6644, 1, 10), (6644, 1, 30), (6644, 3, 10), (6644, 2, 60),
    (4000, 4, 399);

CREATE TABLE PURCHASES_BY_TIMECODE
    SELECT TIMECODE, AVG(PURCHASEVALUE) AS AVG_PURCHASEVALUE
    FROM PURCHASES
    GROUP BY PURCHASES.TIMECODE;
我得到的警告错误消息数据为AVG_PURCHASEVALUE列截断。当我查看新表的数据类型时,我看到:

时间码tinyint4

平均采购值小数14,4

我猜avg函数返回的是一些不符合mysql为第二列的数据类型所发明的小数14,4的内容

结果看起来很合理,但我更愿意对其进行编码,以避免出现此错误。我想我需要做的是 a显式指定我的表的列数据类型,我现在使用create/select, 或 b将平均值四舍五入为零小数,这样它就适合整数了,我通过回避它们来避免数据类型问题

方法a有两个问题: 1.我不知道如何通过create/select语句定义列数据类型——或者从语法上看,这是否可能做到——我遇到的create/select的唯一用法不是显式声明列类型

假设我可以找到一个合适的语法来声明类型,我不确定将它转换成什么类型,这样错误就会消失,avg计算的结果将是相同的类型,因为我不确定这个类型是什么,或者是否可以在函数中以某种方式指定它 两个问题:

在这种情况下,方法b是否最适合我的目的?在这个例子中,我实际上并不关心小数点。但在其他一些用例中,我可能会这样做。 我将如何着手进行方法a?以防它适合我将来遇到的其他情况 谢谢


p、 不用说,我是sql新手…

您可以使用第二个参数指定AVG的小数位数:在您的情况下,因为您不关心小数位数,所以使用0

ROUND(AVG(PURCHASEVALUE), 0) AS AVG_PURCHASEVALUE

“值”通常表示为一个小数点,对应于相关货币的小数位数。第二个表确实应该是一个视图?事务值是int,而不是DECIMAL。我不控制数据类型。至于它是否应该是十进制的,我不确定每种方法的利弊。至于它是否应该是一个视图,可能。这是永远不会更改的历史日志类型数据,我将对摘要数据进行许多后续分析。对我来说,计算一次并保存结果适合这个用例,即使它不是通俗的sql。但是使用我没有考虑过的视图可能有一些好处。语法错误。改为使用:ROUNDAVGpurchasevalue,0这显然是fwd的方式-不确定我是否应该根据评论中实际存在的正确答案接受答案?