根据列更新空值

时间:2014-03-21 11:04:23

标签: sql ms-access

所以我得到了这个非常不一致的记录(仅举例):

经理|助理| FTE |收入
鲍勃|詹姆斯| Y | 500个
鲍勃|詹姆斯| NULL | 100个
鲍勃|詹姆斯| Y | 200个
凯莉|里克| N | 200个
凯莉|里克| N | 500个
凯莉|里克| NULL | 300个

所以我想要的目标是总结收入,但问题在于群体中的零点将它们分开。所以我想写一个更新声明,说基本上“好看,看起来詹姆斯和鲍勃都是FTE,所以让我们更新到Y和凯利,瑞克不是那么更新到没有。”

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

2 个答案:

答案 0 :(得分:0)

您还没有给出主键列,这使得它更难一些。我在下面称它为{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()函数在这里工作,因为它忽略了null,如果你传入null,其他一些函数会返回null。

答案 1 :(得分:0)

你可以"归咎于"使用聚合函数的值。以下查询按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;