Здравствуйте, у меня сложилась такая ситуация, нужно к основной выборке по таблице 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
Комментариев нет:
Отправить комментарий