2014-12-03 79 views
-2

我正在使用SQL Server 2008對一些數據進行總結。數據類型爲money,它被設置爲不允許空值。當我總結時,由此產生的數據是貨幣,但允許空值。這是一個問題,當我在C#中使用代碼作爲貨幣時,不允許空值不等於允許空值的貨幣,以及允許數據爲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

如何非空數量的總和永遠爲空? – zmbq 2014-12-03 20:07:00

+1

包括相關的代碼和例子? – HaveNoDisplayName 2014-12-03 20:07:06

+1

任何左側在查詢中加入缺少的數據?這是我可以看到空列進入該列的唯一方法 – Jeremy 2014-12-03 20:08:53

回答

1

你可以嘗試明確的結果轉換成非空值:

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

或者C#的側手柄可能null值。

+0

使用isnull處理了這個。我沒有想到桌子上的左連接有可能丟失記錄導致空值。 – Kennethj 2014-12-03 20:43:19

0

使用decimal爲您的錢類型,因爲它將始終有一些默認值。像:

decimal myMoney = 300.5m; 

如果您需要有一個可爲空的類型小數,您可以使用decimal?。然後,你可以做myDecimal.HasValue

+0

'decimal'不能爲null,這是關鍵問題。 – 2014-12-03 20:14:16

+0

更新了我的帖子 – 2014-12-03 20:15:00

0

如果你感到快樂的結果爲0,其中否則你得到一個空:

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