3

这是我用来重现问题的表定义:

create table test_sum_type 
(
  kind char(1) not null,
  n tinyint not null
);

测试数据:

+------+---+                                                                                                                                                                                                    
| kind | n |                                                                                                                                                                                                    
+------+---+                                                                                                                                                                                                    
| A    | 1 |                                                                                                                                                                                                    
| B    | 1 |                                                                                                                                                                                                    
| A    | 2 |                                                                                                                                                                                                    
+------+---+  

使用查询MySQLdb

In [32]: cur.execute("select kind, sum(n) from test_sum_type group by kind")                                                                                                                                    
Out[32]: 2L                                                                                                                                                                                                     

In [33]: cur.fetchall()                                                                                                                                                                                         
Out[33]: (('A', Decimal('3')), ('B', Decimal('1')))                                                                                                                                                             

In [34]: cur.execute("select kind, n from test_sum_type")                                                                                                                                                       
Out[34]: 3L                                                                                                                                                                                                     

In [35]: cur.fetchall()                                                                                                                                                                                         
Out[35]: (('A', 1), ('B', 1), ('A', 2))  

如您所见,Decimal当我使用sum.

我查看了MySQLdb的源代码,默认情况下只设置了两种要转换为Decimal的字段类型:DECIMALNEWDECIMAL.

这可能是什么原因?有没有办法检查特定查询中使用的一些临时表的架构?

4

1 回答 1

6

这是 MySql 设计的。

GROUP BY(聚合)函数
SUM() 和 AVG() 函数为精确值参数(整数或 DECIMAL)返回一个 DECIMAL 值,为近似值参数(FLOAT 或 DOUBLE)返回一个 DOUBLE 值。(在 MySQL 5.0.3 之前,SUM() 和 AVG() 为所有数字参数返回 DOUBLE。)

如果你需要返回一个INT然后CAST它。

SELECT kind, CAST(SUM(n) AS SIGNED) n 
  FROM table1 
 GROUP BY kind

这是SQLFiddle演示

于 2013-06-09T03:31:26.950 回答