2016-04-21 53 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函数。