2011-11-14 3 views
2

MySQL 테이블에서 VARCHAR - 열은 문자열 -, 정수 -, 부동 - 값 등을 나타내는 다른 값을가집니다. 이 값은 언어 별 String으로 데이터베이스에 기록됩니다. 즉, 123.45의 float 값은 "123,45"과 같은 String으로 쓸 수 있습니다 (VB.Net을 사용하여 ...)MySQL : 문자열을 독일어/부동 소수점으로 변환

평균이 필요합니다. 동일한 그룹에있는 부동 소수점 값 : MySQL 내에서 FLOAT에 이러한 문자열을 어떻게 캐스트 할 수 있습니까? 단순히 AVG(CONVERT(value, DECIMAL))이 작동하지 않으므로 (반환 값은 99.00000) FLOAT으로 변환 할 수 없습니다.

문자 집합은 utf8이고, 조합은 utf8_general_ci입니다.

샘플 테이블 :

id | value | group 
1 | 122,45 | 1 
2 | 66,34 | 1 
3 | blabla | 2 
4 | 109,21 | 1 
5 | bababa | 2 

목표 : SELECT AVG(CONVERT(value, DECIMAL)) FROM table WHERE (group=1) 같은 somethig에는 99.333333하지 99 발생한다.

어떤 아이디어?

크리스토프

PS : 나는

답변

7

당신은 문자열 함수 형식 (X, D, 로케일)

SELECT AVG(CONVERT(
    REPLACE(REPLACE(value, '.', ''), ',', '.'), 
    DECIMAL(10,2))) 
FROM `table` 
WHERE `group`=1 
+0

일부 상황에서는 이것이 실패 할 수 있습니다. 독일어로 된 값은 T1234.56' 값은 "1.234,56"'이라고 쓰여질 수 있습니다. 위의 결과는''1.234.56 "'으로 변환되어'1'로 변환됩니다. –

+0

@ ChristophMühlmann : 수정 된 게시물 – Marco

+0

편집 한 코드가 작동 할 수도 있고 그렇지 않을 수도 있습니다. 포인트가 소수점이면 무엇입니까? 데이터베이스 레이아웃을 약간 변경하기로 결정했습니다. 이제 숫자 데이터 (float, int 및 boolean이'DECIMAL (30,10)'- 열에 저장 됨)와 다른 데이터 (텍스트, 직렬화 된 데이터, 이진 데이터 등). 더 잘 작동하고 MySQL의 숫자 열의 값으로 직접 계산할 수 있습니다 (AVG/MIN/MAX f.e.) –

관련 문제