2016-10-24 1 views
0

私はチャットサイトを構築しており、観客にチャットを提示するために、私は3ドロップダウンリスト - スポーツ(デフォルトはすべてのスポーツ)、日/月/年、オンラインユーザー/トータルユーザーを持っています。デフォルトでは、すべてのスポーツを選択し、私は1ヶ月と総ユーザーを選択した場合2左結合がまとめられ、結果が乗算されます。しかし、それはしないでください

今、期待される結果は

する必要があります私のクエリは

SELECT DISTINCT roo.[Sports], 
       roo.[Name], 
       COUNT(DISTINCT chu.ChatUserLogId) AS TotalUsers, 
       COUNT(DISTINCT liu.[LoggedInUserID]) AS UserOnline 

FROM Room AS roo 

LEFT JOIN LoggedInUser AS liu ON roo.RoomID = liu.RoomID 
LEFT JOIN ChatUserLog AS chu ON roo.RoomID = chu.RoomID 
       AND chu.LoggedInTime >= DATEADD(DAY,-30,GETDATE()) 

GROUP BY roo.[Sports], roo.[Name] 
ORDER BY TotalUsers DESC 

一人が私の方法で私はことを示唆しています実際には2つの結合&のために行を乗算するので、私は最初に集約する必要があります。

だから、最後に、私はこのクエリすぎ

with agg_ChatUserLog as (select RoomId, count(*) as cnt_user_tot from ChatUserLog WHERE LoggedInTime >= DATEADD(DAY,-30,GETDATE()) group by RoomId),            

     agg_LoggedInUser as (select RoomId, count(*) as cnt_user_logged from LoggedInUser group by RoomId) 

select Sports, Name, cnt_user_tot, cnt_user_logged from Room r 

     left outer join agg_ChatUserLog acu on acu.RoomId = r.RoomId 

     left outer join agg_LoggedInUser alu on alu.RoomId = r.RoomId; 

を試みたが、これも結果を乗算されます。

私は両方のクエリで間違いを犯していますか?おかげさまで、ありがとうございました。

サンプルデータは、次のとおりです。

Chatroom name Total Users Online users    

Basketball 
Roomname27   32    5 
Roomname11   15    3 
Roomname32   8    1 

Football 
Roomname5   63    12 
Roomname18   44    7 
Roomname4   15    2 
+0

2番目の方法は良いようです。サンプルデータと2番目のクエリ結果を追加します –

+0

コメントに含まれていない質問 –

+0

@Prdpご質問のサンプルを追加しました。ご協力いただきありがとうございます。 –

答えて

0

あなたは別の構文を試すことができます。この構文で

select Sports, 
    Name, 
    coalesce(
     ( 
      select count(distinct C.ChatUserLogId) 
      from ChatUserLog as C 
      where C.RoomId = R.RoomId 
       and C.LoggedInTime >= DATEADD(DAY,-30,GETDATE()) 
     ), 
    0) AS TotalUsers, 
    coalesce(
     (
      select count(distinct D.LoggedInUserID) 
      from LoggedInUser as D 
      where D.RoomId = R.RoomId 
     ), 
    0) AS UserOnline 
from Room R 

を、あなたはroomnameの数よりも多くの結果を持っていることはありません。 しかし、あなたはまた、部屋whitout聴衆を持っています

+0

これは最初にコード化された方法です...しかし、それは事件をさらに悪化させています。最初に集計してから、データを選択すると、オンラインユーザーがいる場合、スポーツのチャットルームのみが繰り返されます。しかし、あなたの質問(私たちが最初に試したもの)には、オンラインユーザはいなくても、スポーツのチャットルームをすべて繰り返すだけです.ONLINE USERS対TOTAL USERSテーブルは掛け合わされます。なぜこのエラーがあるのでしょうか?ありがとうございます –

+0

私は、GROUG BY項目の問題も推測しています... "とagg_ChatUserLogを使って(ChatIserLogからのcnt_user_totとしてRoomId、count(*)を選択してください)LoggedInTime> = DATEADD(DAY、-30、GETDATE (RoomId)を選択すると、ルーム名からcnt_user_tot、cnt_user_logged、cnt_user_loggedを選択します。左側の外部結合agg_ChatUserLog acuをacu.RoomId = r.RoomId左側の外部結合agg_LoggedInUser alu on alu.RoomId = r.RoomId GROUP BYスポーツ、cnt_user_tot ORDER BY cnt_user_tot DESC " –

関連する問題