Страницы

Поиск по вопросам

среда, 10 июля 2019 г.

Как объединить несколько выборок в одно представление SQL

Здравствуйте, у меня сложилась такая ситуация, нужно к основной выборке по таблице players добавить еще одну выборку с другой таблицы (statisticsTable). Суть в том, что у игрока много статистик за каждую игру, и мне нужно вывести дополнительные столбцы в суммами по нескольким полям. примерно так
select sum(StatisticsTable.Falls) as 'Фолов за всю жизнь' from StatisticsTable, Players where (Players.PlayerID = StatisticsTable.PlayerID)
сам запрос для первой таблицы выглядит вот так
select Players.FirstName as 'Имя', Countries.NationalityName as 'Национальность', Teams.TeamName as 'Команда', Positions.PositionName as 'Позиция', datepart(year,getdate())-datepart(year, Convert(Varchar, DateOfBurn, 104)) as 'Возраст' from Players, Countries, Positions, Teams where ((Players.CountryID = Countries.CountryID) and (Players.TeamID = Teams.TeamID) and (Players.PositionID = Positions.PositionID))
Но просто поставить UNION между этими запросами приводит к ошибке "Сообщение 205, уровень 16, Все запросы, объединенные с помощью операторов UNION, INTERSECT или EXCEPT, должны иметь одинаковое число выражений в целевых списках. " Помогите пожалуйста грамотно объединить эти 2 выборки


Ответ

union, который вы пытаетесь применить, используется для получения дополнительных строк в выборке, а не дополнительных столбцов. А все строки разумеется должны иметь одинаковое количество столбцов.
Если я правильно понял, вы хотите получить столбец где будет сумма некоей статистики по каждому игроку (почему в приведенном первым запросе нет group by не представляю, он вам давал сумму по всем игрокам, что при запросе в разрезе игроков как то странно).
select Players.FirstName as 'Имя', Countries.NationalityName as 'Национальность', Teams.TeamName as 'Команда', Positions.PositionName as 'Позиция', datepart(year,getdate())-datepart(year, Convert(Varchar, DateOfBurn, 104)) as 'Возраст', (select sum(StatisticsTable.Falls) from StatisticsTable where (Players.PlayerID = StatisticsTable.PlayerID) ) as 'Фолов за всю жизнь' from Players, Countries, Positions, Teams where ((Players.CountryID = Countries.CountryID) and (Players.TeamID = Teams.TeamID) and (Players.PositionID = Positions.PositionID))
Если надо выбрать много колонок из таблицы статистики, то лучше переписать запрос так:
select Players.FirstName as 'Имя', Countries.NationalityName as 'Национальность', Teams.TeamName as 'Команда', Positions.PositionName as 'Позиция', datepart(year,getdate())-datepart(year, Convert(Varchar, DateOfBurn, 104)) as 'Возраст', Stat.Falls as 'Фолов за всю жизнь', Stat.xyz as 'Еще какая то статистика' from Players, Countries, Positions, Teams, (select PlayerID, sum(StatisticsTable.Falls) as Falls, sum(xyz) as xyz from StatisticsTable group by PlayerID ) Stat where Players.CountryID = Countries.CountryID and Players.TeamID = Teams.TeamID and Players.PositionID = Positions.PositionID and Players.PlayerID = Stat.PlayerID

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

Отправить комментарий