2015-01-06 2 views
2

올바르게 설명하는 방법을 모르겠습니다. 내 세부 표에서 수수료를 찾으려고합니다. 수수료가 모두 $ 10.00이라고 가정 해 보겠습니다.Case 문, varchar 값을 데이터 유형 int로 변환 할 때 변환하지 못했습니다.

내가하려는 것은 tranname = 'Corr Official'이고 Fee.Waiver가 Null 인 경우 필드 값을 음수로 만드는 것입니다. 문제는 테이블의 필드가 varchar라는 것입니다. 나는 캐스트와 개종자를 성공시키지 않으려 고 노력했다. int 데이터 형식에 VARCHAR 값 '$ 10.00을'변환 할 때 변환이 실패

메시지 245, 수준 16, 상태 1, 줄 1 :

(Case when Detail.FieldValue = '$0.00' and tranname = 'Official' then Fee.Waiver * -1 
when TranName = 'CORR-Official ' and Fee.Waiver IS not null then Fee.Waiver 
when TranName = 'CORR-Official' and Fee.Waiver IS null then Cast(Detail.FieldValue, int) * -1 
when Detail.FieldValue = '$0.00' and Fee.Waiver IS not null then Fee.Waiver * -1 
when Fee.Waiver IS not null then Fee.Waiver * -1 
when Detail.FieldValue is null and Fee.Waiver IS null then Detail.FieldValue  
else Detail.FieldValue end) as FieldValue 

여기 내 오류입니다.

+0

FieldValue에 통화 값을 저장하는 이유는 무엇입니까? 솔직히 끔찍한 디자인입니다. 숫자 값은 숫자 열에 저장해야합니다. '$ 0.00 '을 0으로 변환 할 수 없다. SQL이 아닌 숫자이기 때문이다. 다른 통화 기호가 아닌 달러 기호 만 있으면 변환하기 전에 달러 기호를 제거 할 수 있습니다. 내가 여기 없을 거라는 걸 알았다면 남자, – LittleBobbyTables

+0

. 왜 그들이 데이터를 이런 방식으로 구성했는지에 대해 저를 시작하지 마십시오. 그것은 내 통제에서 벗어났다. 사용자 융통성 ... – donviti

+0

요금의 데이터 유형은 무엇입니까? – HoneyBadger

답변

4

SQL이 숫자가 아니기 때문에 $ 0.00을 0으로 변환 할 수 없습니다.

디자인이 통제 범위를 벗어난 것으로 보이고 달러 기호 만 있고 다른 통화 기호가 없다고 가정하면 변환하기 전에 달러 기호를 제거 할 수 있습니다.

when TranName = 'CORR-Official' and Fee.Waiver IS null then 
    Cast(Replace(Detail.FieldValue, '$', '') as decimal(18, 2)) * -1 

아니면 (가의 철저한하자, 헤이처럼 보이지만하지 않는) 여러 통화가있는 경우 :

when TranName = 'CORR-Official' and Fee.Waiver IS null then 
    Cast(RIGHT(Detail.FieldValue, len(Detail.FieldValue) - 1) as decimal(18, 2)) * -1 

세 번째 줄에

는 이렇게 정수 대신 10 진수로 변환해야합니다. 그렇지 않으면 다음과 같이 나타납니다.

Msg 245, Level 16, State 1, Line 4

Conversion failed when converting the varchar value '0.00' to data type int.

그 sa ID를 사용하는 경우 데이터를 표준화하고 적절한 데이터 유형을 사용하는 것이 더 좋습니다.

+1

'substring' 그것은 달러 또는 파운드 또는 엔 또는 헝가리 florint 또는 무엇 이건간에 상관 없습니다. – HoneyBadger

+0

@HoneyBadger - true; 나는 여기서 게으른 길을 택했다. 일관성을 위해 편집 됨 – LittleBobbyTables

+0

메시지 195, 수준 15, 상태 10, 줄 6 'decimal'은 (는) 인식 할 수없는 기본 제공 함수 이름입니다. 필드에는 여러 통화가 없지만 달러 기호가없는 다른 텍스트가 포함됩니다. 내가 뭘 당긴다해도 안된다 ... 스트레스가 있어서는 안된다 ... 주인이 항상 그렇지 않다는 것을 알고 있기 때문에 – donviti

관련 문제