2017-11-26 3 views
0

私は2つのテーブルを持っています。メンバーとストリーム。 私はすべてのメンバーの平均ストリーム数を見つけて、どの個人メンバー(名前を含む)が平均ストリーム数よりも多くストリーミングしたかを見たいと思います。すべてのユーザーの平均「数」より大きい「数」を持つ「メンバー」を見つける方法を教えてください。

現在、私はストリームの平均数と各メンバーが持つストリームの数を見つけるこのクエリを持っています。私は平均的な数よりもストリームの小さい番号を持つメンバーを破棄するように、これは、SQLのために働くだろう

CREATE TABLE "M_5006677"."MEMBER" 
    ( "M_ID" NUMBER(2,0), 
    "FNAME" VARCHAR2(15 BYTE) NOT NULL ENABLE, 
    "MNAME" VARCHAR2(15 BYTE), 
    "LNAME" VARCHAR2(15 BYTE) NOT NULL ENABLE, 
    "EMAIL" VARCHAR2(25 BYTE) NOT NULL ENABLE, 
    "R_DATE" DATE NOT NULL ENABLE, 
    "L_DATE" DATE, 
    CONSTRAINT "PK_M_ID" PRIMARY KEY ("M_ID") 

CREATE TABLE "M_5006677"."STREAM" 
    ( "STREAM_ID" NUMBER(2,0), 
    "SDATE" DATE, 
    "SPOSITION" NUMBER(5,2), 
    "F_ID" NUMBER(2,0) NOT NULL ENABLE, 
    "M_ID" NUMBER(2,0) NOT NULL ENABLE, 
    "LIVE" VARCHAR2(3 BYTE), 
    CONSTRAINT "PK_STREAM" PRIMARY KEY ("STREAM_ID") 
CONSTRAINT "FK_F_ID" FOREIGN KEY ("F_ID") REFERENCE FILM 
CONSTRAINT "FK_M_ID" FOREIGN KEY ("M_ID") REFERENCE MEMBER 
+0

をいくつかのサンプルデータと一緒にテーブルのスキーマを追加してください。それは本当にあなたの問題を解決するのに役立つでしょう。 –

答えて

2

私は、ウィンドウ関数を使用します。あなただけの今までにストリーミングされているメンバーカウントするようにしたい場合:

select m_id 
from (select m_id, count(*) as cnt, avg(count(*)) over() as avg_overall 
     from streams 
     group by m_id 
    ) s 
where cnt > avg_overall; 

を使用すると、ストリーミング決してメンバーカウントするようにしたい場合:

select m_id 
from (select m_id, count(*) as cnt, avg(count(s.m_id)) over() as avg_overall 
     from members m left join 
      streams s 
      on m.m_id = s.m_id 
     group by m_id 
    ) s 
where cnt > avg_overall; 
0

一緒にメンバーとストリームのテーブルを結合する方法を見つけるのに苦労しています

select stream.m_ID, count(*), (select avg (count(*)) from stream group by stream.m_ID) from stream group by stream.m_ID;

サーバー:

select stream.m_ID, count(*), (select avg (count(*)) from stream group by stream.m_ID) from stream group by stream.m_ID 
having count(*) < (select avg (count(*)) from stream group by stream.m_ID) 

メンバーに関するデータを取得する場合は、M_IDをクエリに含めてメンバーテーブルに参加する必要がありますそのように:あなたはメンバー表とM_IDに参加することができその後

select stream.m_ID, M_ID, count(*), (select avg (count(*)) from stream group by stream.m_ID) from stream group by stream.m_ID ,M_ID 
having count(*) < (select avg (count(*)) from stream group by stream.m_ID) 

select FNAME from Member m 
join (select stream.m_ID, M_ID, count(*), (select avg (count(*)) from stream 
group by stream.m_ID) from stream group by stream.m_ID ,M_ID 
    having count(*) < (select avg (count(*)) from stream group by 
stream.m_ID)) X on m.M_ID = X.M_ID 
+0

こんにちは、これはありがとうございます!メンバーの名前を取得するためにメンバーとストリームに参加しなければならないということだけが問題です。 –

+0

すべてのselectを新しいクエリのsubselselectとして使用してください。 私の答えが役に立つと分かったら、答えとして選択してください(答えの下のチェックマーク):) – Radu

+0

@JoshBurgessメンバーに関するデータを得るために私の答えを修正しました。 申し訳ありませんが、あなたの前のコメントを削除しました:) – Radu

関連する問題