SQL Server — Получение определенных данных в группе по запросу

#sql #join #subquery

#sql #Присоединиться #подзапрос

Вопрос:

У меня есть хранимая процедура SQL, которая суммирует результаты для бейсбольной команды. Я «Группирую по» соответствующим столбцам и суммирую остальные, которые мне нужны, чтобы получить общую статистику для выбранного запроса. Это работает нормально и дает мне желаемые результаты.

Ситуация, с которой я сталкиваюсь, заключается в том, что в случаях, когда один игрок может принадлежать к разным командам в течение одного сезона, я не могу сгруппировать по команде. Что я сделал, так это использовал подзапрос, чтобы получить текущую команду игроков. Опять же, работает нормально. Но мне нужно будет получить больше индивидуальной информации, такой как текущий идентификатор команды игрока. Я не могу объединить два столбца в упомянутом выше подзапросе. Плохая практика запускать несколько подзапросов против основного запроса? Есть ли какой-либо другой способ получить конкретную (или отличную) информацию из запроса при использовании Group By?

РЕДАКТИРОВАТЬ добавленную схему таблицы.

 SELECT LS.SeasonName, A.SeasonID, PM.PlayerID, PM.PFirstName, PM.PLastName,
(SELECT     ILT.TeamName
                        FROM          League_T AS ILT INNER JOIN
                                               Season_T AS IST ON ILT.TeamID = IST.TeamID INNER JOIN
                                               Season_P AS ISP ON IST.SeasonTeamID = ISP.Season_TeamID
                        WHERE      (ISP.PlayerID = PM.PlayerID) AND (ISP.IsCurrent = 1)) AS 'CurrentTM', 
                       (SELECT     ILT.TeamID
                        FROM          League_Team AS ILT INNER JOIN
                                               Season_Team AS IST ON ILT.TeamID = IST.TeamID INNER JOIN
                                               Season_P AS ISP ON IST.SeasonTeamID = ISP.Season_TeamID
                        WHERE      (ISP.PlayerID = PM.PlayerID) AND (ISP.IsCurrent = 1)) AS 'CurrentTMID', 
Count(Case WHEN GS = 1 THEN GS END) AS GS, --multiple SUM columns here--
FROM Player_Master PM
INNER JOIN Season_P ON PM.PlayerID = Season_P.PlayerID 
INNER JOIN Season_S AS A 
INNER JOIN Season_SD AS B ON A.GameID = B.GameID
INNER JOIN Season_PP AS C ON B.OutcomeID = C.OutcomeID ON Season_P.Season_PlayerID = C.SeasonPlayerID
INNER JOIN League_Season AS LS ON A.SeasonID = LS.SeasonID
WHERE (B.TeamID = @TeamID) AND (LS.IsCurrent = 1)
Group By LS.SeasonName, A.SeasonID, PM.PlayerID, PM.PFirstName, PM.PLastName
  

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

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

Ответ №1:

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

Не могли бы вы JOIN перейти к таблице «игроки», а затем присоединиться к таблице «команды» на основе столбца «player.current_team»?

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

1. Мэтью, я должен подумать об этом … Я добавил схему выше. В принципе, групповые запросы немного ограничили меня. Как это работает: Лига владеет командой, лига владеет сезоном, лига владеет игроками. Затем сезон владеет seasonTeam (присоединен к команде лиги), сезонная команда владеет игроком сезона (присоединен к игроку лиги). Статистика игрока принадлежит игре И сезонной команде (b.c один игрок может выступать за несколько сезонных команд в сезоне).