Bigprey Ответов: 1

2 левых соединения (MSSQL) складываются вместе, умножая результаты. Но этого не должно быть


Я создаю сайт чата, и для представления чатов аудитории у меня есть 3 выпадающих списка-Спорт (по умолчанию все виды спорта), День/месяц/год, пользователи онлайн/общее количество пользователей.

Теперь, если по умолчанию выбраны все виды спорта и я выбираю 1 месяц и общее количество пользователей, ожидаемый результат должен быть

Мой вопрос таков

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


Один человек предположил, что с помощью моего метода я на самом деле умножаю строку из-за двух соединений, поэтому мне нужно сначала агрегировать, а затем объединять.

Так что в конце концов я тоже попробовал этот запрос

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;


Но это также умножает результаты.

Где я делаю ошибку в обоих запросах?

Спасибо заранее и иметь хороший день впереди.

Что я уже пробовал:

Я думаю, что проблема также связана с "группировкой по" пунктам... Итак, я пытаюсь изменить и опробовать их тоже в

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 GROUP BY cnt_user_tot ORDER BY cnt_user_tot DESC

1 Ответов

Рейтинг:
0

OriginalGriff

Вероятно, это ваше предложение GROUP BY - оно создает группы на основе обоих столбцов отдельно, а не как комбинацию.
Таким образом, он создает набор групп на основе первого столбца, а затем разделяет их на основе второго столбца.
Это может помочь объяснить, что он делает: SQL GROUP By и ошибка" имя столбца недопустимо в списке выбора, потому что..."[^]
Я не могу предложить решение напрямую, потому что я не уверен точно, что вы вводите и ожидаете получить без реальных примеров входных и выходных данных.