2014-12-03 2 views
-2

SQL Server 2008을 사용하여 일부 데이터를 합산합니다. 데이터 유형이 money이고 null을 허용하지 않도록 설정되었습니다. 요약 할 때 결과 데이터는 돈이지만 null을 허용합니다. 이 문제는 C#에서 코드를 사용할 때 null이 허용되는 돈이 데이터를 허용하는 다른 문제 중에 null을 허용하는 돈과 같지 않기 때문에 문제입니다. 이 혼란을 극복하기 위해 내가 뭘 할 수 있을까?SQL Server 합계 데이터 형식 변경

내 SQL은 다음과 같습니다

SELECT  
    dbo.Subcontracts.SubcontractID, dbo.Subcontracts.AccountNumber, 
    dbo.SubcontractAmounts.ObjectCode, dbo.Subcontracts.AppendId, 
    dbo.Subcontracts.BeginDate, dbo.Subcontracts.EndDate, 
    dbo.Subcontracts.RecipientGrantorId, dbo.Subcontracts.CheckA133, 
    dbo.Subcontracts.CheckDebarment, dbo.Subcontracts.CostshareRequired, 
    dbo.Subcontracts.CostshareAmountRequired, dbo.Subcontracts.CreatedOn, 
    dbo.Subcontracts.CreatedBy, dbo.Subcontracts.ModifiedOn, 
    dbo.Subcontracts.ModifiedBy, dbo.Subcontracts.IsDeleted, dbo.Subcontracts.FARate, 
    dbo.Subcontracts.SubContractAgreementTypeId, dbo.Subcontracts.ContractRiskLevelId, 
    CAST(SUM(dbo.SubcontractAmounts.SubAmount) AS money) AS TotalSubAmount, 
    SUM(dbo.SubcontractPayments.PaymentAmount) AS TotalPaymentAmount, 
    SUM(dbo.SubcontractPayments.AdvanceAmount) AS TotalAdvanceAmount, 
    SUM(dbo.SubcontractPayments.CostshareAmount) AS TotalCostshareAmount, 
    SUM(dbo.SubcontractAmounts.SubAmount - dbo.SubcontractPayments.PaymentAmount) AS UnpaidBalance 
FROM   
    dbo.Subcontracts 
INNER JOIN 
    dbo.SubcontractAmounts ON dbo.Subcontracts.SubcontractID = dbo.SubcontractAmounts.SubcontractID 
LEFT OUTER JOIN 
    dbo.SubcontractPayments ON dbo.SubcontractAmounts.SubcontractAmountID = dbo.SubcontractPayments.SubcontractAmountID 
GROUP BY 
    dbo.Subcontracts.SubcontractID, dbo.Subcontracts.AccountNumber, 
    dbo.Subcontracts.AppendId, dbo.Subcontracts.BeginDate, dbo.Subcontracts.EndDate, 
    dbo.Subcontracts.RecipientGrantorId, dbo.Subcontracts.CostshareAmountRequired, 
    dbo.Subcontracts.CreatedOn, dbo.Subcontracts.CreatedBy, 
    dbo.Subcontracts.ModifiedOn, dbo.Subcontracts.ModifiedBy, dbo.Subcontracts.FARate, 
    dbo.Subcontracts.SubContractAgreementTypeId, dbo.Subcontracts.ContractRiskLevelId, 
    dbo.Subcontracts.IsDeleted, dbo.Subcontracts.CheckA133, dbo.Subcontracts.CheckDebarment, 
    dbo.Subcontracts.CostshareRequired, dbo.SubcontractAmounts.ObjectCode 

이는 음속라는 제 3의 도구로 끌려 가고있다. 그건 내가 원하지 않는 데이터를 nullable로 인식한다. 데이터와 상호 작용하는 코드가 생성되었으므로 변경할 수는 없습니다. 데이터를 사용할 수있는 모든 곳에서 데이터를 변경할 수 있지만 원하는 것이 아니거나 좋은 해결책은 아닙니다.

+3

하는 방법 null 이외의 숫자의 합이 그 어느 null이 될 수 있습니까? – zmbq

+1

관련 코드 및 예제가 포함되어 있습니까? – HaveNoDisplayName

+1

누락 된 데이터가있는 쿼리의 모든 왼쪽 조인? 그건 내가 그 열에 들어가는 null을 볼 수있는 유일한 방법입니다. – Jeremy

답변

1

을 수행 할 수 있습니다 당신은 null이 아닌 값으로 결과를 변환 명시 적으로 시도 할 수 있습니다.

+0

isnull을 사용하여 이것을 처리했습니다. null 값의 누락 된 레코드가있는 테이블의 왼쪽 조인에 대해서는 생각하지 않았습니다. – Kennethj

0

항상 기본 값을 가지므로 금액 유형으로 decimal을 사용하십시오. 마찬가지로 : 당신이 nullable 형식의 진수를해야하는 경우

decimal myMoney = 300.5m; 

, 당신은 decimal?를 사용할 수 있습니다.

SELECT ISNULL(SUM(Amount), 0) FROM MyTable 

를 또는 C#을 측면에서 가능한 null 값을 처리 : 그럼 당신은 myDecimal.HasValue

+0

'decimal'은 null 일 수 없습니다. 이것이 핵심 문제입니다. –

+0

updated 내 게시물 –

0

당신이 그렇지 않으면 널 얻을 할 위치를 0을 할 수있는 결과에 대한 행복 경우 :

long result = (long)(dbCommand.ExecuteScalar() ?? 0)