我有一种情况似乎无法解决。我必须说我是一个很新的访问和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时,对于您加入的那些记录(国家,城市),然后如果仍未找到,则仅加入(国家/地区)。
抱歉,我觉得我没有表现得很好,希望你能理解= /有没有办法快速完成?
谢谢!
答案 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;