2016-04-21 52 views
0

我試圖使第二個空值中可能包含或不包含的兩列的平均值。有人能幫助我瞭解如何在這些值之間進行操作嗎?使用空值操作的SQL Server

select 
    nib, primeiroTitular, segundoTitular, 
    ((YEAR(GETDATE()) - YEAR(P1.dataNascimento)) + 
    (YEAR(GETDATE()) - YEAR(P2.dataNascimento)))/2 as média 
from 
    ContasBancarias 
left join 
    Pessoas P1 on P1.bi = ContasBancarias.primeiroTitular 
left join 
    Pessoas P2 on P2.bi = ContasBancarias.segundoTitular 
+1

那麼這個問題很明顯是泥巴。當一個值爲NULL時,您希望發生什麼?你看過ISNULL函數嗎? –

+0

我想將空值變爲0. –

+0

ISNULL(Your_Column,0) – William

回答

1

以下是您可以做的事情。我改變了在兩個日期之間進行計算的方式我使用了DATEDIFF()函數下次嘗試在您提出問題時嘗試縮進代碼,這會讓人們在嘗試讀取代碼時更容易。

SELECT nib 
    , primeiroTitular 
    , segundoTitular 
    ,(DATEDIFF(YEAR,GETDATE(), CASE 
            WHEN P1.dataNascimento IS NULL 
            THEN GETDATE() 
            ELSE P1.dataNascimento 
           END) 
    + DATEDIFF(YEAR,GETDATE(),CASE 
            WHEN P2.dataNascimento IS NULL 
            THEN GETDATE() 
            ELSE P2.dataNascimento 
           END))/2 as média 
FROM ContasBancarias 
LEFT JOIN Pessoas P1 
ON P1.bi = ContasBancarias.primeiroTitular 
LEFT JOIN Pessoas P2 
ON P2.bi = ContasBancarias.segundoTitular 
+0

您可以刪除第一個案例,您確定只有第二列可以爲NULL。您也可以將'THEN GETDATE()'更改爲您想要提供的任何值。 – cczak

0

假設只有第二欄可以NULL試試這個 -

([Column1] + ISNULL(Column2,0))/2 AS [Average]

0

精度的利益,我建議不包括在你的公式任何NULL值,因爲NULL表示「不要」不知道價值是什麼「,」不知道價值是什麼「,或者」不知道這個價值是否相關「。將零值賦給NULL是爲了歪曲結果。

最準確的結果,使用WHERE子句從計算中消除任何具有NULL的行或ISNULL函數。