2016-05-03 7 views
0

これらは私のテーブルです: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 

私は村の1人あたりの平均注文数を調べようとしています。

私はクエリを作成しましたが、何も注文していない村の人々の結果は除外しています。

マイクエリ:私が欲しいもの

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 | 3 
    v2 | 2 

それは何の受注が取られていないところから、第三の村を考慮していない:私は取得しています何

vname | avg 
    v1 | 1.5 
    v2 | 1 
    v3 | 0 

場所はありますが、人はいませんが、私はそれを見せたいと思います。また、村1の人Bは発注していないため、村1の人Aからの注文のみが考慮される。 V1から人物2からV1及び0から人物Aから3桁で

、平均は3/2でなければならないが、それは他の人を除外とするような3

任意リードである3/1を示しますどこが間違っていて、どのようにしてクエリを完成させることができますか?

+0

旧式のコンマ結合構文は使用しないでください。ジョインについては、その後、私たちに戻ります。 – Strawberry

答えて

1

LEFT JOINをお試しください

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 

を試してみてください

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 
0

に参加する参加し、内側の左の代わりに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 
関連する問題