MS ACCESS查询以查找未找到匹配项时的平均值

时间:2015-08-18 21:49:23

标签: sql ms-access join match average

我有一种情况似乎无法解决。我必须说我是一个很新的访问和sql,所以也许这很容易:

让我们以此表为例:

Country | State | City  | Value
   A        X      1       30
   A        X      2       40
   A        Y      3       50

然后,在另一张表中

Country | State | City  | Value
   A        X      1       ?
   A        X      4       ?
   A        Z      5       ?

我需要一个连接两个表的查询才能返回'?'在第二个表格上:

当找到组合城市/州/国家时,它应该返回该记录(表之间的标准连接)。

当联接不存在时(例如,左联接会将"值"列留空)以使用" parent"的平均值。 ,所以第一行是30,第二行是(40 + 30)/ 2 = 35,第三行是(30 + 40 + 50)/ 3 = 40。

这就像连续三次加入:首先,你加入(国家,城市,州),然后返回AVG(价值)。然后,当AVG(VALUE)= NULL时,对于您加入的那些记录(国家,城市),然后如果仍未找到,则仅加入(国家/地区)。

抱歉,我觉得我没有表现得很好,希望你能理解= /

有没有办法快速完成?

谢谢!

2 个答案:

答案 0 :(得分:0)

我无权访问Access(没有双关语),但这样的事情应该有效。它可能需要一点校对。

SELECT a.country, a.city, a.state,
       iif(b.value IS NULL, a.avgval, b.value) as value
FROM (select country, state, city, avg(value) as avgval
      from table_a) a
LEFT JOIN table_b b
  ON a.country = b.country
 AND a.city = b.city
 AND a.state = b.state;

编辑:进行更多搜索,听起来像Access不支持SQL CASE语句,所以我用iif替换了我认为你想要的行为。

答案 1 :(得分:0)

我认为您需要使用多个聚合来执行此操作。然后使用left join来确定值的优先级:

select b.country, b.city, b.state, nz(nz(a.value, acs.avgv), ac.avgv) as value
from ((b left join
       a
       on b.country = a.country and b.state = a.state and b.city = a.city
      ) left join
      (select country, state, avg(value) as avgv
       from a
       group by country, state
      ) acs
      on acs.country = b.country and acs.state = b.state
     ) left join
     (select country, avg(value) as avgv
      from a
      group by country
     ) ac
     on ac.country = a.country;