2014-04-01 22 views
-1

處理sql查詢,但發現Sum不喜歡小數,這就是爲什麼小數值(XX,XX)變成整數。我的數據庫是通過與作爲數據透視表和度量的measure_routine連接的例程構建的。SQL查詢返回int而不是小數

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; 

enter image description here

數據庫:

enter image description here

+1

呃......總和不喜歡小數?以什麼方式? –

+0

是的,我認爲是。 – user3185936

+0

感謝您的狀態報告。你說你發現歪曲MySQL操作。測試用例很容易證明SUM集合函數在DECIMAL值上運行得很好。你有問題嗎? – spencer7593

回答

0

你有問題嗎?

您觀察到的行爲的最可能的解釋是隱式數據類型轉換。您不提供有關列的數據類型以及行內容的足夠信息,以確定這些信息。

如果您value列是字符數據類型(例如CHAR或VARCHAR),你可能想使用CASTCONVERT功能將其轉換成一個DECIMAL類型,然後在執行的總和。

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數據類型值就好了工作。

你問一個問題嗎?


UPDATE

看來,您的查詢的SUM聚合是不是在十進制數據類型操作,您所指定SUM上VARCHAR數據。所以,MySQL正在對數字數據執行隱式數據轉換。

我認爲要問的真正的問題是爲什麼十進制值被存儲爲字符數據類型。

爲字符串轉換爲值,以十進制解釋逗號字符作爲小數點,你可以做這樣的事情:

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 
+0

是我還是應該用逗號輸出:https://www.dropbox.com/s/h04z5twtauv6eee/test.png – user3185936

+0

@ user3185963:我相信MySQL總是使用點字符('.')作爲十進制分隔器;我不相信有什麼方法可以在MySQL中改變這種情況。(但是你也許會發現,我不是這方面的權威,我認爲MySQL的方法是顯示的區域設置應用在應用程序的表示層;數據庫使用單一的標準,我知道MySQL不會' t像千位分隔符;當我從文本中執行'LOAD DATA'時,必須將其從表達式中移除,並且需要將字符串轉換爲數字 – spencer7593

+0

@ user3185963:如果需要用逗號字符替換小數點分隔符,你可以將結果從SUM(expr)轉換回一個字符串,並使用REPLACE函數進行所需的替換,例如「REPLACE(SUM(expr),',',',')AS' 「同樣,我們通常不會那樣做,我們會讓數據庫返回從SQL SUM返回的內容,並且我們會處理任何格式以在表示層中顯示。 – spencer7593

相關問題