2014-09-09 1 views
0

SQL 쿼리를 통해 소수점 두 자리 만 표시되도록 노력하고 있습니다. 불행히도 그것은 매우 복잡한 쿼리이고 "decimal (18,2)"의 모든 조합은 작동하지 않습니다.캐스트를 사용할 때 10 진수 반올림 문제

SELECT DISTINCT 
       Company_Name AS Company, CASE WHEN isnull((CAST(IsNull(SUM(Margin), 0)/CASE isnull(SUM(invoiceamt), 0) WHEN 0 THEN 1 ELSE SUM(invoiceamt) 
       END * 100 AS decimal(18, 2))/70), 0) < 0 THEN 0 ELSE (CAST(IsNull(SUM(Margin), 0)/CASE isnull(SUM(invoiceamt), 0) 
       WHEN 0 THEN 1 ELSE SUM(invoiceamt) END * 100 AS decimal(18, 2))/70) END * 100 AS Service_Goal 
FROM   v_cbi_Agr_Mo_Billing_History3 
WHERE  (1 = 1) AND (dbo.udf_cbi_InternalCompanyName() <> Company_Name) AND (DATEDIFF(mm, GETDATE(), MonthStart) BETWEEN 0 AND 0) AND 
       (AGR_Type_Desc IN ('Agreement1', 'Agreement2', 'Agreement3')) 
GROUP BY Company_Name 
HAVING  (SUM(Margin) <> 0) OR 
       (SUM(InvoiceAmt) <> 0) 
ORDER BY Company 
+0

이 도움이 어려울 것! 어떤 오류가 발생하고 있습니까? 'Service_Goal' 열에있는 모든 구성 요소를 분리 해 볼 수 있습니다. 일단 그들이 모두 예상대로 작동하면 다시 넣거나 그냥 임시 테이블에 기록하려고 할 수 있습니다. 또한 isnull 및 정수에 소수를 추가하여 INT를 캐스팅하지 못하게 할 때 도움이되는 경우가 있습니다 ('ISNULL (x, 0.)''x/70.') – Malk

답변

1

이 블록을 10 진수로 캐스팅 한 다음 70으로 나누면 더 많은 소수점이 표시됩니다.

모든 교정을 수행 한 다음 10 진수 (10,2)로 변환하는 것으로 변경할 수 있습니다. 어떻게 계산했는지 모르겠습니다.

Cast(Isnull(Sum(@margin), 0)/CASE Isnull(Sum(@invoiceamt), 0) 
            WHEN 0 THEN 1 
            ELSE Sum(@invoiceamt) 
            END * 100/70 AS DECIMAL(18, 2)) 
0

표현식의 결과를 원하는 정밀도로 변환 해보십시오. 내부 캐스팅은 정수 나누기를 피하는 데 사용됩니다. 예를 들어

:

select 
    cast(100/cast(77 as decimal(10,2)) as decimal(10,2)), 
    100/cast(77 as decimal(10,2)) 

출력 :

--------------------------------------- --------------------------------------- 
1.30         1.29870129870