这些是我的表:o,p和v对应于订单,人和村
v对应村庄
vk | vname
1 | v1
2 | v2
3 | v3
p对应村里的人。 A和B住在V1。 C住在V2。
pk | pname | vk
1 | A | 1
2 | B | 1
3 | C | 2
o对应于人们下达的订单。来自V1的人A已经下了3个订单,来自V2的人C已下了1个订单。
ok | pk | cost
1 | 1 | 10
2 | 1 | 100
3 | 1 | 20
4 | 3 | 200
我试图找出一个村庄每人的平均订单数量。
我已经形成了查询,但它排除了那些没有下订单的村庄的人的结果。
我的查询:
SELECT
v.vname,
count(ok) / count(DISTINCT o.pk) AS avg
FROM
v,
o,
p
WHERE
p.pk = o.pk
AND p.vk = v.vk
GROUP BY
v.vk;
我想要的是什么:
vname | avg
v1 | 1.5
v2 | 1
v3 | 0
我得到的是什么:
vname | avg
v1 | 3
v2 | 2
它没有考虑没有订单发生的第三个村庄,也没有人存在,但我希望它能够展示。此外,来自村庄1的人B没有下订单,因此,仅考虑来自村1中的人A的命令。
来自V1的人A的3个订单和V1的人2的3个订单,平均值必须是3/2但不包括另一个人并显示3/1是3。
关于我哪里出错以及如何完善查询的任何线索?
答案 0 :(得分:1)
使用左连接和内连接
SELECT v.vname, count(ok)/count(distinct o.pk) AS avg
FROM v
left join o on o.pk = p.pk
inner join p on p.vk = v.vk
group v.vname
答案 1 :(得分:0)
尝试使用LEFT JOIN
代替archaic comma join
SELECT v.vname, NULLIF(count(ok)/count(distinct o.pk),0) AS avg
FROM v
LEFT JOIN p ON p.vk = v.vk
LEFT JOIN o ON o.pk = p.pk
GROUP BY v.vname
答案 2 :(得分:0)
试试这个
select v.vname, NULLIF(count(o.ok)/count(p.pk),0)
from v
left join p on (v.vk = p.vk)
left join o on (p.pk = o.pk)
group by 1
你可能需要处理除以零的异常我猜