2016-12-12 4 views
0

oracleには、サプライヤと顧客の2つのテーブルがあります。それぞれのフィールド名は「国」 国ごとにサプライヤーと顧客の合計数を求め、これらの2つのカウントを加算して各国の単一カウントとして表示する必要があります。Northwindスキーマで2つのテーブルに参加し、国別のレコード数を表示する

私はテーブル(サプライヤと顧客)ごとに1つずつ、2つのクエリを持っています。しかし、それらをどのように組み合わせるのですか?

SELECT S.Country, count(distinct(S.CompanyName)) as cnt 
from NW_Suppliers S 
group by S.Country 

SELECT C.Country, count(distinct(C.CustomerID)) as cnt1 
from NW_Customers C 
group by C.Country 

誰でも助けてください。

+0

2つの組み合わせで何をしたいですか?カウントを追加し、両方のカウントを表示します。 – MT0

+0

カウントを追加します。たとえば、ベネズエラに3社のサプライヤーと4人の顧客があった場合は、count = 7としてリストされます。 – Arvinth

+0

また、DISTINCTはキーワードではありません。 – MT0

答えて

1

ただ、2つの参加:彼らはあなたが2つのテーブル間の重複を処理する方法に応じてわずかに異なる答えを与えるが、そのう

SELECT Country, 
     COUNT(DISTINCT name) AS total 
FROM (
    SELECT Country, CompanyName AS Name 
    FROM NW_Suppliers 
    UNION 
    SELECT Country, CustomerID 
    FROM NW_Customers 
) 
GROUP BY Country 

SELECT COALESCE(S.Country, C.Country) AS country, 
     COALESCE(c.cnt, 0) + COALESCE(s.cnt, 0) AS total 
FROM (SELECT Country, 
        COUNT(DISTINCT CompanyName) AS cnt 
     FROM  NW_Suppliers 
     GROUP BY Country 
     ) S 
     FULL OUTER JOIN 
     (SELECT Country, 
        COUNT(DISTINCT CustomerID) AS cnt 
     FROM  NW_Customers 
     GROUP BY Country 
     ) C 
     ON (s.country = c.country) 

それともUNION 2つのテーブルをあなたの意図された振る舞いが何であるべきかあなたの説明からは不明です。

+0

どちらも問題ありません。ありがとうたくさん:) 2番目のクエリで 'group by'を追加しました – Arvinth

+0

OPのポストの文字通りの解釈は、(彼/彼女の本当の要件ではないかもしれませんが)ユニオンの2つのブランチのDISTINCT国を選択することです。しかしUNION ALLには2つの結果があります。このように、企業が顧客またはサプライヤーのいずれかとして複製されている場合、その企業は顧客とサプライヤーの両方に1回しかカウントされませんが、容量ごとに2回カウントされます。繰り返しますが、それは必要なことではないかもしれませんが、それはOPの言葉が意味するものです(意図的に、そうでなくても)。 – mathguy

0
SELECT S.Country, count(distinct(S.CompanyName)) as cnt 
from NW_Suppliers S 
group by S.Country 

Union all 

SELECT C.Country, count(distinct(C.CustomerID)) as cnt 
from NW_Customers C 
group by C.Country 
関連する問題