2017-04-12 140 views
3

嗨我想根據第3列中的內容計算2列值。根據第3列值計算2列

下面的錯誤代碼將數據類型varchar轉換爲數字時出錯。

我相信它試圖將貨幣列設置爲新值而不是測試。

任何人都可以幫助我的語法。

謝謝。

SELECT dbo.ORDR.DocTotal, 
     dbo.ORDR.DocTotalFC, 
     test = case 


when dbo.RDR1.Currency = 'GBP' then dbo.ORDR.DocTotal - dbo.ORDR.VatSum 
when dbo.RDR1.Currency = 'USD' then dbo.ORDR.DocTotalFC - dbo.ORDR.VatSumFC 
when dbo.RDR1.Currency = 'EUR' then dbo.ORDR.DocTotalFC - dbo.ORDR.VatSumFC 

else 'other' 
end 


FROM dbo.RDR1 INNER JOIN 
        dbo.ORDR ON dbo.RDR1.DocEntry = dbo.ORDR.DocEntry 
+0

你有樣品數據和所需的輸出? – Tanner

+0

在猜測,我會說'DocTotal'或'VatSum'不是數字數據類型,因此在子句中的減法失敗....但你需要向我們展示模式和數據,否則我們'重新猜測。 – Tanner

+1

您不能隨意決定將此列中的值設置爲varchar,而對於其他行,則爲varchar。您必須爲所有行中的給定列使用單一數據類型。你的情況表達式正在做數學或返回一個字符串文字。您需要在那裏返回NULL或強制您的計算值爲varchar。 –

回答

7

與CASE表達式

else 'other' 

的其他部分,因爲你的情況表達的問題返回其他場景值的一些整數類型,但在其他部分你是它與以前的不兼容返回字符串值值。嘗試用一些整數值替換其他條件作爲默認值

2

錯誤是由您的其他條件造成的,我們將返回other。列中的值看起來是money或某種形式的decimal(x,x)

我們不能混合選定列中的數據類型。因此,我們不能在case語句中混合類型,因爲它返回單個列。

理想情況下,您應該將其他條件設置爲像0.0這樣的貨幣金額,以便不會出錯並保持一致。

未來,您的caseelse部分是尋找這些錯誤的好地方,正如您根據您的意見所看到的那樣。這通常是開發人員嘗試混合數據類型的地方。

如果必須退回other,投你的其他返回值更改爲varchar:

SELECT dbo.ORDR.DocTotal, 
     dbo.ORDR.DocTotalFC, 
     test = case 


when dbo.RDR1.Currency = 'GBP' then cast((dbo.ORDR.DocTotal - dbo.ORDR.VatSum) as varchar(255)) 
when dbo.RDR1.Currency = 'USD' then cast((dbo.ORDR.DocTotalFC - dbo.ORDR.VatSumFC) as varchar(255)) 
when dbo.RDR1.Currency = 'EUR' then cast((dbo.ORDR.DocTotalFC - dbo.ORDR.VatSumFC) as varchar(255)) 

else 'other' 
end 


FROM dbo.RDR1 INNER JOIN 
        dbo.ORDR ON dbo.RDR1.DocEntry = dbo.ORDR.DocEntry 
+1

是的,我刪除了其他評論,因爲它不需要在那裏,它是從我複製的其他代碼中遺留下來的,它正凝視着我的臉,我錯過了它。感謝您的幫助。 –

+0

良好的呼叫!這可能是最好的事情。返回列的實際數據類型是理想的。 – RexMaison

+0

由於這現在正在使用select語句,我希望更新表中的實際列。 'dbo.ORDR.DiscSum',請您指出我改變劇本的正確方向,我可以在一張桌子上做,但我不確定如何加入2張桌子。 –

1

明白了。謝謝你的鏈接:)

update dbo.ORDR 
set DiscSum = case 
when dbo.RDR1.Currency = 'GBP' then dbo.ORDR.DocTotal - dbo.ORDR.VatSum 
when dbo.RDR1.Currency = 'USD' then dbo.ORDR.DocTotalFC - dbo.ORDR.VatSumFC 
when dbo.RDR1.Currency = 'EUR' then dbo.ORDR.DocTotalFC - dbo.ORDR.VatSumFC 

end 


FROM   dbo.RDR1 INNER JOIN 
        dbo.ORDR ON dbo.RDR1.DocEntry = dbo.ORDR.DocEntry