2017-03-11 14 views
1

私はSQLのnoobですので、これは皆さんにとって非常に基本的かもしれませんが、私はここでいくつかのロジックを適用するのに苦労しています。私は2つのテーブル(サプライヤと消費者のテーブル)から3つの取引テーブルでリンクされたすべての都市と州のリストを作成し、各都市のサプライヤと消費者の数をグループ化して一覧表示しようとしています。注目すべき点は、都市と州の数が2つのテーブルに一致しないことです。一致するものについては、サプライヤーと消費者の対応する数を示す出力が必要です。州/都市が1つのテーブルに存在し、それ以外のテーブルに存在しない場合は、対応する数値列の下に表示される0の数値が必要です。 私は下表のように、サプライヤ、コンシューマ、トランザクションの3つのテーブルをSupp_IDとCon_IDでキーとしてリンクしています。SQL結合の問題 - 期待された出力が得られません

SELECT S.State, S.City, COUNT(S.Supp_ID) AS Supp_Count, COUNT(C.Con_ID) AS Cust_Count 
FROM SuppTb S, TransTb T, ConsTb C 
WHERE S.Supp_ID = T.Supp_ID AND T.Con_ID = C.Con_ID 
GROUP BY S.State, S.City 

このクエリを入力した場合、私はサプライヤとコンシューマの数カウントに対して奇妙な数を取得しています。私の最高の推測は、そこにはどこかで自己結合がなければならないが、ここからこれをどうやって取るかはわからない。どんな助けもありがとう!

SELECT DISTINCT City, State, COUNT(Supp_ID) 
FROM SuppTb S GROUP BY City, State 

SELECT DISTINCT City, State, COUNT(Con_ID) 
FROM ConTb C GROUP BY City, State 

私が個別に両方のテーブルから必要な出力が得られます。

PSをuをありがとうございます。出力1は3列と7行、出力2は3列と6行です。私は4つの列と8つの行と1つの組み合わせた出力が必要です。これらの2つの出力を結合し、必要に応じてゼロを挿入する方法を理解するだけです。

編集 - 正確な質問は、各都市のサプライヤーと消費者のそれぞれの数でサプライヤーまたは消費者の州と都市の比較リストを生成することです。 SUPP /短所テーブルは都市/状態が列挙されていない場合に出力用

State  City  Supp_count  Cons_count 
Illinois Chicago  2     3 
Illinois Springfield 2     0 
Michigan Lansing  0     3 

など即ち、0を出力 - 望ましいです。

編集2このコードを試してみて、私に顧客数をカウントしてもらいましたが、サプライヤ数には奇妙な数字があります。私は今完全に立ち往生しています!アイデアの不足..

SELECT C.State, C.City, COUNT(DISTINCT S.Supp_ID) AS Supp_Count,  COUNT(DISTINCT C.Con_ID) AS Cust_Count 
FROM Tb_Supplier S LEFT JOIN Tb_Transactions T 
ON S.Supp_ID = T.Supp_ID LEFT JOIN 
    Tb_Consumer C ON T.Con_ID = C.Con_ID 
    GROUP BY C.State, C.City 
EXCEPT 
SELECT S.State, S.City, COUNT(DISTINCT S.Supp_ID) AS Supp_Count, COUNT(DISTINCT C.Con_ID) AS Cust_Count 
FROM Tb_Supplier S LEFT JOIN Tb_Transactions T 
ON S.Supp_ID = T.Supp_ID LEFT JOIN 
    Tb_Consumer C ON T.Con_ID = C.Con_ID 
GROUP BY S.State, S.City 

答えて

1

まず、FROM句では決して使用コンマ。 常には、明示的な適切なJOIN構文を使用します。

2つの無関係なディメンションを結合しているため、クエリではstate/cityの組み合わせのデカルト積が生成されます。最も簡単な解決策はCOUNT(DISTINCT)を使用することです:

SELECT S.State, S.City, 
     COUNT(DISTINCT S.Supp_ID) AS Supp_Count, 
     COUNT(DISTINCT C.Con_ID) AS Cust_Count 
FROM SuppTb S JOIN 
    TransTb T 
    ON S.Supp_ID = T.Supp_ID JOIN 
    ConsTb C 
    ON T.Con_ID = C.Con_ID 
GROUP BY S.State, S.City; 

各寸法に沿ってあまりにも多くの重複がない場合、これは、正常に動作します。の結合を行う前に、より適切な解決策が集約にあります。

+0

ありがとうございます。構文でJOINするとわかりやすくなります。しかし、依然として望ましい出力は得られませんでした。正確に必要なものを含めるように編集しました。LEFT JOINを使用して作成した最新のトレールを追加しました。顧客数は適切ですが、依然としてサプライヤ数あなたの質問を実行したときのように) – Cur123

+0

@ Cur123。 。 。あなたは 'COUNT(DISTINCT)'を使っていますか? –

+0

はい私はMr.Linoffをやった。私は、UNIONを使用して最初にテンポラリテーブルを作成し、その後、完全な外部ジョイントを通じてサプライヤテーブルと消費者テーブルにテンポラリテーブルをリンクして、私が望む正確な結果を得ることができました。本当に長い時間を過ごしましたが、ついにそれを得るために非常に満足していました!私は私がそれを得るとすぐに自分の答えを投稿しました..私はそれを明確にしていない場合は謝罪..再びあなたのサポートのおかげで! – Cur123

0

更新 - 私は自分自身で答えを得ました!最初に私が興味を持っていたDISTINCTの州と都市をすべて列挙する新しいテーブルを作成しました(UNION ALLの代わりにUNIONを使用して、前回のdupを削除しました)。FULL JOINを使用してサプライヤとコンシューマテーブルを結合しました新しいテーブル。

ああ!あなたがプログラミング言語を完全に新しくしているときに、あなた自身ですべての質問を得ることの喜びはちょうど...比較を超えて! ありがとうございました!

関連する問題