【问题标题】:SQL Server Return Null if existsSQL Server 如果存在则返回 Null
【发布时间】:2015-08-18 16:23:23
【问题描述】:

在 SQL Server 2008 中,我希望创建一个查询,该查询将在聚合中返回 NULL(如果存在),否则我正在寻找最大值。这是一个简化的例子……

我有以下数据:

    CO  Loc Term_Dt
    1   A   7/15/2013
    1   B
    1   C   10/30/2000
    2   A   8/10/2008
    2   B   6/1/2015
    2   C   4/30/2010

我要找的结果是:

    CO  Term_Dt
    1   NULL
    2   6/1/2015

因为从技术上讲,如果至少有一个地点尚未终止,公司仍然营业。

谢谢

【问题讨论】:

    标签: sql sql-server


    【解决方案1】:

    只需使用聚合和case 语句:

    select co,
           (case when count(term_dt) = count(*) then max(term_dt)
            end) as term_dt
    from table t
    group by co;
    

    count(<column>) 计算非NULL 值的数量。如果这不匹配所有行,那么至少有一个是NULLcase 不需要else,因为默认为NULL

    【讨论】:

    • 如此优雅(叹气)我需要改进我的思维。奥卡姆的胜利之刃!
    【解决方案2】:

    生成具有空任期日期的公司的子数据集,然后加入您的超集。第二个表中的任何非空记录都希望显示为空,因此请使用 case 语句。

    这是因为我们的外部表 (A) 返回了

    CO TERM_DT  
    1  7/15/2013
    2  6/1/2015  
    

    但是我们的内联视图上的 LEFT 连接也添加了 B.Co...

    CO TERM_DT   B.CO
    1  7/15/2013 1
    2  6/1/2015  NULL
    

    所以你可以看到,当 B.CO 不为空时我们想显示 NULL 而不是 max(TERM_DT) 将产生所需的结果。这是使用 case 语句完成的。

    SELECT A.Co, 
        Case when B.CO is not null then Max(A.Term_DT) else NULL end as Term_DT
    FROM tableName A
    LEFT JOIN (SELECT Distinct CO from tableName where Term_dt is null) B
     on A.Co = B.CO
    GROUP BY CO
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-05-11
      • 1970-01-01
      • 2019-05-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多