【发布时间】:2015-09-14 20:17:37
【问题描述】:
我正在做一个汇总表,我正在创建一个按平均值聚合的新表。此处显示的小示例:
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 的数据被截断”。当我查看新表的数据类型时,我看到:
TIMECODE tinyint(4)
AVG_PURCHASEVALUE 十进制 (14,4)
我的猜测是 avg 函数返回的内容不适合 mysql 为第二列的数据类型发明的小数 (14, 4)。
结果看起来很合理,但我更愿意对其进行编码,以免出现此错误。我认为我需要做的是 (a) 明确指定我现在使用创建/选择执行的表的列数据类型, 或 (b) 用零小数对平均值进行四舍五入,使其适合 int,并且我通过回避它们来避免数据类型问题。
方法(a)的两个问题:
1.我不确定如何通过创建/选择语句定义列数据类型——或者这是否可以在语法上做到——我遇到的创建/选择的唯一用途没有明确声明列类型
- 假设我可以找到一个合适的语法来声明类型,我不确定将它转换成什么类型,这样错误就会消失并且平均计算的结果将是相同的类型,因为我不是确定这个类型是什么,或者是否可以在函数中以某种方式指定
两个问题:
- 在这种情况下,方法 b 最适合我吗?在这种情况下,我实际上并不关心小数点。 (但在其他一些用例中我可能会。)
- 我将如何着手进行方法 a? (以防它适合我将来遇到的其他情况)
谢谢!
附言不用说,我是 sql 新手...
【问题讨论】:
-
“值”通常表示为带有相关货币的适当小数位数的 DECIMAL。
-
当然第二张表应该是一个视图?
-
交易值是整数,不是十进制。 (我不控制数据类型。)至于是否应该是十进制,我不确定它们的优缺点。至于它是否应该是一个视图,可能。这是永远不会改变的历史日志类型数据,我将在汇总数据上进行许多后续分析。对我来说,只做一次计算并保存结果就适合这个用例,即使它不是通俗的 sql。但是使用我没有考虑过的视图可能会有好处。
标签: mysql runtime-error rounding type-conversion sqldatatypes