【问题标题】:MySQLdb return `Decimal` for a `sum` of `INT`MySQLdb为“INT”的“总和”返回“十进制”
【发布时间】:2013-06-05 01:20:58
【问题描述】:

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

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))  

如您所见,当我使用sum 时,结果列是Decimal

我查看了MySQLdb的源代码,只有两种字段类型设置为默认转换为DecimalDECIMALNEWDECIMAL

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

【问题讨论】:

    标签: python mysql mysql-python temp-tables


    【解决方案1】:

    这是在 MySql 中设计的。

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

    如果您需要返回INT,则返回CAST

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

    这里是SQLFiddle演示

    【讨论】:

      猜你喜欢
      • 2011-11-20
      • 2021-06-11
      • 2014-08-10
      • 1970-01-01
      • 2014-12-04
      • 2021-08-31
      • 2015-09-17
      • 2020-03-28
      • 2012-09-16
      相关资源
      最近更新 更多