2016-06-13 2 views
3

У меня есть простая таблица ниже, где он выводит все игрок в пределах всех команд, которые играют в 1-е недели, лиги 1.Мнение и случайные числа

SELECT DISTINCT p.PlayerID, p.Position, t.TeamID, t.TeamAbbreviation, f.WeekNumber 
FROM dbo.Fixture f 
INNER JOIN dbo.League l ON f.LeagueID = l.LeagueID 
INNER JOIN dbo.Team t ON l.LeagueID = t.LeagueID 
INNER JOIN dbo.Player p ON t.TeamID = p.TeamID 
WHERE f.WeekNumber = 1 and l.LeagueID = 1 

Это просто выводят длинный список и то, что я требую, является следующее, которое я не знаю, как это сделать, как я новичок, когда речь идет о T-SQL:

  • из всех игроков (есть 20 игроков в команде), только выбрать случайный набор из 11 игроков в команде. Из 11 игроков, однако, должен требуемое количество позиций:

1 ГК, 4 DF, 4 MF, 2 FW (Эти буквенные аббревиатуры определяются поле «Позиция», где присваивается каждый игрок позиция)

Тогда я хочу отображать команды, выпущенные друг против друга. Например, если на неделе 1 команда teamID 1 играет teamID 4, то отобразите сторону 11 игроков из команды 1 против 11 игроков в команде 4. Сделайте это для остальных команд. Светильники уже установлены в таблице приборов (прилагается скриншоты)

Как это можно достичь?

Крепеж стол:

enter image description here

Текущие результаты запроса:

enter image description here

ответ

5

Вы должны использовать ROW_NUMBER() для достижения этой цели:

SELECT * FROM(
    SELECT tt.*, 
      ROW_NUMBER() OVER(PARTITION BY tt.teamID,tt.position ORDER BY newid()) as rnk 
    FROM(
     SELECT DISTINCT p.PlayerID, p.Position, t.TeamID, t.TeamAbbreviation, f.WeekNumber, 
     FROM dbo.Fixture f 
     INNER JOIN dbo.League l ON f.LeagueID = l.LeagueID 
     INNER JOIN dbo.Team t ON l.LeagueID = t.LeagueID 
     INNER JOIN dbo.Player p ON t.TeamID = p.TeamID 
     WHERE f.WeekNumber = 1 and l.LeagueID = 1) tt) s 
WHERE (s.position = 'GK' and s.rnk = 1) OR 
     (s.position = 'DF' and s.rnk <= 4) OR 
     (s.position = 'MF' and s.rnk <= 4) OR 
     (s.position = 'FW' and s.rnk <= 2) 

Это будет ранжировать каждый группа (teamID,position) случайным образом, а последняя статья WHERE выберет 1 GK, 4 DF, 4 MF, 2 FW.

+0

Удивительно, спасибо –

Смежные вопросы