【问题标题】:Sql query returning int instead of decimalsSql 查询返回 int 而不是小数
【发布时间】:2023-03-23 03:50:01
【问题描述】:

处理sql查询,但发现Sum不喜欢小数,这就是小数值(XX,XX)变成整数的原因。我的数据库是用与 measure_routine 连接的例程建立起来的,作为数据透视表和测量值。

SQL:

SELECT routines.date, routines.time, SUM( IF( measurements.title =  'T_Badende_per_Time', routines.value, 0 ) ) AS T_Badende_per_Time,
                                     SUM(IF(measurements.title = 'T_Temperatur', routines.value, 0)) AS T_Temperatur
FROM routines
INNER JOIN measure_routine ON routines.id = measure_routine.routine_id
INNER JOIN measurements ON measure_routine.measure_id = measurements.id
GROUP BY routines.date, routines.time
ORDER BY routines.date, routines.time;

数据库:

【问题讨论】:

  • 呃... sum 不喜欢小数?以什么方式?
  • 感谢您的状态报告。您所说的您发现的内容歪曲了 MySQL 操作。测试用例很容易证明 SUM 聚合函数在 DECIMAL 值上运行得很好。你有问题吗?
  • 有趣,然后我很不确定为什么我的 sql 查询没有返回小数。另一种想法是,如果我将逗号更改为点,我会得到值。
  • 我建议你尝试一个简单的测试用例。使用数据类型 DECIMAL 的列创建表,填充几行,然后运行返回该列的 SUM() 的查询。

标签: mysql sql phpmyadmin sum


【解决方案1】:

你有问题吗?

您观察到的行为最可能的解释是隐式数据类型转换。您没有提供有关列的数据类型和行的内容的足够信息来确定这一点。

如果您的 value 列是字符数据类型(例如 CHAR 或 VARCHAR),您可能希望使用 CASTCONVERT 函数将其转换为 DECIMAL 类型,然后对其执行 SUM .

http://dev.mysql.com/doc/refman/5.5/en/type-conversion.html

http://dev.mysql.com/doc/refman/5.5/en/cast-functions.html#function_cast

SELECT CAST('30.95' AS DECIMAL(20,2)) 
     , CONVERT('30.95',DECIMAL(20,2))

一个简单的测试用例演示了 SQL SUM() 聚合函数对 DECIMAL 数据类型值的操作很好。

你是在问问题吗?


更新

您的查询中的 SUM 聚合似乎没有在 DECIMAL 数据类型上运行,您在 VARCHAR 数据上指定了 SUM。因此,MySQL 正在执行到数字数据的隐式数据转换。

我认为要问的真正问题是为什么将十进制值存储为字符数据类型。

要将字符串作为值转换为 DECIMAL,将逗号字符解释为小数点,您可以执行以下操作:

SELECT r.date
     , r.time
     , SUM(IF(m.title = 'T_Badende_per_Time'
       ,CONVERT(REPLACE(r.value,',','.'),DECIMAL(20,2))
       ,0)) AS T_Badende_per_Time
     , SUM(IF(m.title = 'T_Temperatur'
       ,CONVERT(REPLACE(r.value,',','.'),DECIMAL(20,2))
       ,0)) AS T_Temperatur
  FROM routines r
  JOIN measure_routine mr 
    ON mr.routine_id = r.id
  JOIN measurements m 
    ON m.id = mr.measure_id
 GROUP BY r.date, r.time

【讨论】:

  • 是我还是应该输出逗号?:dropbox.com/s/h04z5twtauv6eee/test.png
  • @user3185963:我相信MySQL总是使用点字符(.)作为小数分隔符;我不相信有任何方法可以在 MySQL 中改变它。 (但您可能会发现其他情况;我不是这方面的权威。我认为 MySQL 的方法是在应用程序的表示层应用显示的区域设置;数据库使用单一标准。我知道 MySQL 没有t 喜欢千位分隔符;当我从文本中执行 LOAD DATA 时,我必须删除带有表达式的那些,并且需要从字符串转换为数字。
  • @user3185963:如果您需要用逗号字符替换小数点分隔符,您可以将 SUM(expr) 的结果转换/转换回字符串,并使用 REPLACE 进行所需的替换功能,例如“REPLACE( SUM(expr) ,'.',',') AS”。同样,我们通常不会这样做,我们会让数据库返回它从 SQL SUM 返回的内容,并且我们会处理任何格式以在表示层中显示。
猜你喜欢
  • 1970-01-01
  • 2019-08-29
  • 2017-08-22
  • 1970-01-01
  • 2020-04-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多