【问题标题】:updating nulls based on column根据列更新空值
【发布时间】:2014-03-21 11:04:22
【问题描述】:

所以我得到了这个非常不一致的记录,例如(只是一个例子):

经理 |助理 |全职 |收入
鲍勃 |詹姆斯 |是 | 500
鲍勃 |詹姆斯 |空 | 100
鲍勃 |詹姆斯 |是 | 200
凯利 |瑞克 | N | 200
凯利 |瑞克 | N | 500
凯利 |瑞克 |空 | 300

所以我想要的目标是总结收入,但问题是在组中的空值有点将它们分开。所以我想写一个更新声明,基本上说“好吧,看起来 James 和 Bob 都是 FTE,所以让我们将其更新为 Y,而 Kelly 和 rick 并没有将其更新为 no。”

我该如何解决这个问题?使用 MSAccess,当然我的表更大,有很多不同的名称组合。

【问题讨论】:

    标签: sql ms-access


    【解决方案1】:

    您可以使用聚合函数“估算”该值。以下查询按manager/associate 聚合,取最大值fte。然后将其连接回原始数据以进行计算:

    select ma.fte, sum(Revenue)
    from table as t inner join
         (select manager, associate, max(fte) as fte
          from table as t
          group by manager, associate
         ) as ma
         on t.manager = ma.manager and
            t.associate = ma.associate
    group by ma.fte;
    

    编辑:

    发布此消息后,我立即意识到join 是不必要的。两个聚合就足够了:

    select ma.fte, sum(Revenue)
    from (select manager, associate, max(fte) as fte, sum(Revenue) as Revenue
          from table as t
          group by manager, associate
         ) as ma
    group by ma.fte;
    

    【讨论】:

      【解决方案2】:

      您没有给出主键列,这使得它有点难。我在下面称它为 {id}。

      对于空值,许多 SQL 方言具有“IfNull”功能,但似乎 MS-Access 没有。您可以通过这种方式获得相同的效果:

      IIF(ISNULL(column),0,column)
      

      你会在 SELECT 中这样使用它:

      SELECT IIF(ISNULL(Revenue),0,Revenue) FROM ...
      

      对于一次性修复,您可以这样做:

      UPDATE {table} SET Revenue=0 WHERE Revenue = NULL;
      

      进行联接以从另一行获取 FTE 更为复杂,而且我无法方便地查看限制和语法是什么。易于理解的方式是嵌套查询:

      UPDATE {table} a SET FTE = (SELECT max(FTE) FROM {table} b WHERE FTE IS NOT NULL AND a.{id} = b.{id})
      

      max() 函数在这里起作用是因为它忽略了空值,如果你传入空值,其他一些函数会返回空值。

      【讨论】:

      • 这并没有真正回答问题,因为 OP 希望 FTE 根据上下文为“Y”或“N”,每次遇到 NULL 时。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-05-28
      • 1970-01-01
      • 1970-01-01
      • 2021-01-14
      • 2016-11-11
      相关资源
      最近更新 更多