Соединение отдельных таблиц SQL

#sql #sql-server #tsql

Вопрос:

 SELECT COUNT(sa.SessionId) AS AttendancePoints, sa.UserId 
FROM SessionAttendance sa 
WHERE IsParticipated = 1 
GROUP BY UserId

SELECT COUNT(sf.Session_Id) AS FeedbackPoints, sf.User_Id 
FROM SessionFeedbacks sf 
GROUP BY User_Id

SELECT SUM(sac.Points) AS ActivityPoints, sac.UserId 
FROM StudentActivities sac 
GROUP BY UserId
 

Пример ВЫВОДА

Есть ли какой-либо способ объединить эти 3 вывода в один вывод, используя общий идентификатор пользователя в SQL Server?

Требуемая Производительность:

 User Id | AttendancePoints | FeedbackPoints | ActivityPoints
 

Комментарии:

1. Пожалуйста, предоставьте примерные данные и желаемые результаты. Ваш вопрос не ясен.

2. Что вы подразумеваете под «присоединиться» — присоединиться-это ключевое слово SQL и с определенным значением. Вы хотите присоединиться к ним? Или объединить наборы результатов? Как и просил Гордон, требуются выборочные данные и желаемые результаты.

3. @DaleK join означает, что мне нужно поместить эти 3 таблицы в одну таблицу

4. @СанджанАсулакшана, но вертикально или горизонтально? Нам нужен пример того, как должны выглядеть ваши данные.

5. @Пример вывода Далека прилагается. Я хочу объединить эти 3 вывода в один вывод, используя этот столбец общего идентификатора пользователя.

Ответ №1:

Просто вставьте их в подзапрос, например.

 SELECT AttendancePoints, UserId
FROM (
    SELECT COUNT(sa.SessionId) AS AttendancePoints, sa.UserId 
    FROM SessionAttendance sa 
    WHERE IsParticipated = 1 
    GROUP BY UserId

    UNION ALL

    SELECT COUNT(sf.Session_Id) AS FeedbackPoints, sf.User_Id 
    FROM SessionFeedbacks sf 
    GROUP BY User_Id

    UNION ALL

    SELECT SUM(sac.Points) AS ActivityPoints, sac.UserId 
    FROM StudentActivities sac 
    GROUP BY UserId
) X
 

Комментарии:

1. Это Уокинг. Спасибо

Ответ №2:

 with BeginCTE as(
SELECT COUNT(sa.SessionId) AS AttendancePoints, sa.UserId 
FROM SessionAttendance sa 
WHERE IsParticipated = 1 
GROUP BY UserId
),
MiddleCTE as
(
SELECT COUNT(sf.Session_Id) AS FeedbackPoints, sf.UserId 
FROM SessionFeedbacks sf 
GROUP BY UserId
),
EndCTE as
(
SELECT SUM(sac.Points) AS ActivityPoints, sac.UserId 
FROM StudentActivities sac 
GROUP BY UserId
)
select a.UserID,a.AttendancePoints,b.FeedbackPoints,c.ActivityPoints from 
BeginCTE a
INNER JOIN MiddleCTE b ON a.UserId=b.UserId
INNER JOIN EndCTE c ON b.UserId=c.UserId
 

Комментарии:

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

Ответ №3:

  • Вы можете использовать union, чтобы объединить их всех в 1
  • чтобы сохранить дифференциацию, вы можете создать категорию
 with combining_points as (
    SELECT COUNT(sa.SessionId) AS AttendancePoints, sa.UserId, 'AttendancePoints' as category
    FROM SessionAttendance sa WHERE IsParticipated = 1 GROUP BY UserId

    union all

    SELECT COUNT(sf.Session_Id) AS FeedbackPoints, sf.User_Id , 'FeedbackScore' as category
    FROM SessionFeedbacks sf GROUP BY User_Id
    union all

    SELECT SUM(sac.Points) AS ActivityPoints, sac.UserId, 'ActivityPoints' as category
    FROM StudentActivities sac GROUP BY UserId
)

select * from combining_points
 

Комментарии:

1. MSSMS Говорит , Msg 207, Уровень 16, Состояние 1, Строка 13 Недопустимое имя столбца «категория». Msg 207, Уровень 16, Состояние 1, Строка 16 Недопустимое имя столбца «категория». Msg 207, Уровень 16, Состояние 1, Строка 19 Недопустимое имя столбца «категория».

2. @триллион вы не можете группироваться по псевдониму таблицы.

3. @SanjanaSulakshana попробуй еще раз

4. @SanjanaSulakshana Я скорректировал

5. @триллион Это не обеспечивает требуемую производительность. Вопрос Обновлен!