2012-10-31 2 views
0

가능한 중복 : 내가 할 때 지금SQL 부문주는 오답

SELECT SUM(totalCalls), 
    SUM(EnteredBTN), 
    SUM(EnteredBTN) * 100/SUM(totalCalls), 
    SUM(EnteredACC), 
    SUM(EnteredACC)/SUM(totalCalls), 
    SUM(SentToTrans), 
    SUM(SentToTrans) * 100/SUM(totalCalls), 
    SUM(Complete_Information), 
    SUM(Complete_Information) * 100/SUM(SentToTrans) 

같은 SQL에서 두 값을 분할하고
What is wrong with this SQL Server query division calculation?

SUM(EnteredACC)/SUM(totalCalls)7/48, 나에게 줘야한다 .14이지만 이 대신 표시됩니다. I는 SUM(EnteredACC)*100/SUM(totalCalls) 할 때

는 주어야 14.58 (또는 15 반올림 때)하지만 결과로 14을 준다. 아무도 도와 줄 수 있습니까?

+4

정수를 정수로 나눕니다. 결과는 정수입니다. 10 진수 결과를 원하면'* 100.0' 또는'* 1.0'을 시도하십시오. 소수점 이하 자릿수를 지정하려면 Lamak 및 Void Ray의 답변과 같은 명시 적 캐스트를 사용하십시오. 그러나 명시적인 정밀도 + 비율을 지정하십시오. –

답변

4

는 대답은 간단하다, 대부분 EnteredACCtotalCallsINT (또는 SMALLINT, BIGINT 등) 인 컬럼의 데이터 유형, 따라서 그것은 당신의 결과는 INT입니다. 따라서 14.58은 14가되고 0.14는 0이됩니다. 데이터 유형에 캐스트 (암시 적 또는 명시 적)를 수행해야합니다.

SUM(CAST(EnteredACC AS DECIMAL(16,4))/SUM(totalCalls) 
+0

고마워요 나는이 특정 임시 테이블을 제외하고 모든 십진 형식으로 설정했다. 어떻게 든 도와 줘서 고마워. –

0

보십시오 : 당신은 포인트 부문 부동 필요 select cast(cast(7 as decimal(18,2))/cast(48 as decimal(18,2)) as decimal(18,2))

+4

명시 적으로 10 진수로 캐스팅하려는 경우 정밀도와 크기를 포함해야합니다. 기본값이 무엇인지 아십니까? OP가 있습니까? 미래의 독자가 될 것입니까? –

+1

나는 그 문제가 데이터 유형과 관련되어 있음을 지적하려고 노력했다. 정밀도와 스케일은 여기서 문제가되지 않습니다. –

+0

특히 코드를 시연 할 때 정밀도/스케일/길이를 제외하는 것은 여전히 ​​바람직하지 않습니다. 다음은 VARCHAR에 대한 나의 주장이지만 DECIMAL, VARBINARY, DATETIME2 등에도 동일하게 적용됩니다. http://sqlblog.com/blogs/aaron_bertrand/archive/2009/10/09/bad-habits-to-kick-declaring- varchar-without-length.aspx –

0

, 부문 정수 없습니다.

SELECT SUM(totalCalls), 
    SUM(EnteredBTN), 
    SUM(EnteredBTN)*100/CAST(SUM(totalCalls) as FLOAT), 
    SUM(EnteredACC), 
    SUM(EnteredACC)/SUM(totalCalls), 
    SUM(SentToTrans), 
    SUM(SentToTrans) * 100/SUM(totalCalls), 
    SUM(Complete_Information), 
    SUM(Complete_Information) * 100/CAST(SUM(SentToTrans) as FLOAT) 
+3

나는 FLOAT가 올바른 대답이라는 데 동의하지 않는다. –

+0

호기심 때문에 왜 '십진법'이 더 적절한가요? –

+0

OP는 소수 둘째를 원하기 때문에. '14.58000000000000000001'과 같이 훨씬 더 큰 숫자로 끝나야한다는 사실 외에도 FLOAT가 더 좋은 이유는 무엇입니까? –