전체 쿼리는 중략 하구요.
,((case(convert(float,rs.bldg_strct_cd ))
when '50' then '40'
when '51' then '40'
when '13' then '45'
when '10' then '45'
when '11' then '45'
when '12' then '40'
when '21' then '50'
when ' ' then '50'
when '32' then '30'
else '1'
end) - (DATEDIFF(year,rs.USE_PERM_YMD,rm.deal_ymd)*1)) / --(convert(float,rs.BLDG_STRCT_CD )))-- 0.4222222222222222
--(case(convert(float,rs.BLDG_STRCT_CD))
case (convert(float,rs.BLDG_STRCT_CD))
when '50' then '40'
when '51' then '40'
when '13' then '45'
when '10' then '45'
when '11' then '45'
when '12' then '40'
when '21' then '50'
when ' ' then '50'
when '32' then '30'
else '1'
end
여기 아래 역시 case 문으로 계산식이 이어지는데요. 계속 "0" 나와서 끊어서 확인 해 본 결과 여기서 "0" 이 발생 되더군요.
위의 내용은 45- 26 / 45 입니다. 당연히 0.47.... 나와야 되는데요.
그냥 "0 " 나옵니다.
혹시나 해서 여기서도 잘라 보았는데요.
19 / 45 제대로 나오구요.
위의 주석 처리는 혹시 읽지 못 하나 싶어서 테스트 로 직접 숫자도 넣어 보고 컬럼에 있는 합계값이랑 코드만으로 테스트 해보았습니다.
도대체 왜! "0" 이 나오는지 도저히 모르겠습니다.
도와주세요.
p.s
맞다 "/' 가 아닌 " + " , " - ", " * " 는 제대로된 값 (45)를 가져와서 잘 계산 합니다.
단지 " / " 만 0 를 뱉어 냅니다.
Comment 5
-
항해자™
2014.12.16 09:18
-
항해자™
2014.12.16 09:26
자료형이 int이기 때문에 소수점 이하의 값이 버려지기에 발생하는 현상이지요,,,
case 아래 기록된 숫자들에 따옴표는 불필요한 형변환이 발생하므로 '45'와 같은 형태가 아니라 45.0과 같은 형태로 하시는게 좋겠네요,,,
when '50' then '40' -> when 50.0 then 40.0 -
ssunsori
2014.12.16 10:31
감사합니다. 내용 보면서 ... 이래야 되나? 라고 생각 하다가 ..
올린 쿼리를 보니 * 1 이더군요 ㅋㅋㅋ
* 1.0으로 하고 나서 잘 나옵니다.
답변 감사합니다.
덕분에 제가 몰 틀려서 이것때문에 몇 시간 고민 했는지 알게 되었습니다.
전 분명 1.0 적었는데 ... 말이죠... 이놈의 키보드 ! 라는 변명을 ㅎㅎ
-
처리짱
2014.12.16 11:05
위가 가능한 이유는 float가 int보다 우선순위가 높기 때문입니다..int 1이 float 1.0으로 자동 컨버티이 되는거죠..
-
ssunsori
2014.12.16 14:56
아하!
좋은것을 배웠습니다. 감사합니다.
이렇게 알게 되는 건 쉽게 잊혀지지 않더라구요.
감사합니다.
(19 * 1.0) / 45
19 / (45 * 1.0)