【问题标题】:SQL Server operating with null value使用空值操作的 SQL Server
【发布时间】:2016-04-21 16:54:11
【问题描述】:

我正在尝试对可能包含或不包含在第二个 Null 值中的两列进行平均。有人可以帮我了解如何在这些值之间进行运算吗?

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

【问题讨论】:

  • 这个问题一清二楚。当一个值为 NULL 时,您希望发生什么?你看过 ISNULL 函数吗?
  • 我想把空值变成0。
  • ISNULL(Your_Column, 0)

标签: sql sql-server null average


【解决方案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

【讨论】:

  • 您可以删除第一种情况,前提是您确定只有第二列可以为 NULL 。您还可以将 'THEN GETDATE()' 更改为您想要提供的任何值。
【解决方案2】:

假设只有第二列可能是 NULL 试试这个 -

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

【讨论】:

    【解决方案3】:

    为了准确起见,我建议不要在方程式中包含任何 NULL,因为 NULL 表示“不知道值”、“不知道值是什么”或“不知道是否这个值是完全相关的”。将零值分配给 NULL 会使结果产生偏差。

    最准确的结果,使用 WHERE 子句从计算中消除任何具有 NULL 的行,或使用 ISNULL 函数。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-11-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-01-31
      • 1970-01-01
      相关资源
      最近更新 更多