所以我得到了这个非常不一致的记录(仅举例):
经理|助理| FTE |收入
鲍勃|詹姆斯| Y | 500个
鲍勃|詹姆斯| NULL | 100个
鲍勃|詹姆斯| Y | 200个
凯莉|里克| N | 200个
凯莉|里克| N | 500个
凯莉|里克| NULL | 300个
所以我想要的目标是总结收入,但问题在于群体中的零点将它们分开。所以我想写一个更新声明,说基本上“好看,看起来詹姆斯和鲍勃都是FTE,所以让我们更新到Y和凯利,瑞克不是那么更新到没有。”
我该如何解决这个问题?使用MSAccess,当然我的表格很多,有很多不同的名称组合。
答案 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;