处理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;
数据库:
答案 0 :(得分:0)
你有问题吗?
您观察到的行为的最可能解释是隐式数据类型转换。您没有提供有关列的数据类型和行内容的足够信息来确定。
如果您的value
列是字符数据类型(例如CHAR或VARCHAR),您可能希望使用CAST
或CONVERT
函数将其转换为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