2012-09-07 2 views
3

У меня есть следующий запрос MS SQL, который перекрестно ссылается на три таблицы (tTeam, tPlayer и tScores), чтобы получить общую сумму «Net score», «Gross score» и «Position», упорядоченную по Net score и Team ,Оценка гольфа SQL Query

SELECT TeamID, Team, NetScore, Gross, 
CASE WHEN cnt > 1 THEN 'T' + CAST(rnk AS VARCHAR(5)) 
     ELSE CAST(rnk AS VARCHAR(5)) 
END Pos 
FROM (
SELECT tTeam.TeamID, 
     tTeam.Title AS Team, 
     SUM(CONVERT(INT, tScores.Net_Score)) AS NetScore, 
     SUM(CONVERT(INT, tScores.Out_Score) + CONVERT(int, tScores.In_Score)) AS Gross, 
     rank() OVER (ORDER BY SUM(CONVERT(INT, tScores.Net_Score))) rnk, 
     COUNT(*) OVER (PARTITION BY SUM(CONVERT(INT, tScores.Net_Score))) cnt 
FROM tScores INNER JOIN tPlayer ON tScores.PlayerID = tPlayer.PlayerID INNER JOIN tTeam ON tPlayer.TeamID = tTeam.TeamID 
WHERE tTeam.TournamentID = 13 
GROUP BY tTeam.TeamID, tTeam.Title) temp 
ORDER BY NetScore, Team 

Запрос отлично работает, но (и здесь, где я нужна помощь), то расчет всех игроков нетто и брутто партитуры команды, когда все, что мне нужно сделать, это вычислить «4 низкие Игрок Net и Gross Scores "только по команде.

Я провел последние полтора дня, вытаскивая свои волосы с этим, и любая помощь будет принята с благодарностью.

Заранее благодарен!

ответ

0

Если я правильно понял, что вы хотите суммировать четыре наименьших баллы только на одного игрока, вы можете использовать другой набор row_numbers, чтобы изолировать самые низкие баллы. Я не думаю, что rn_gross необходим (основанный на функции rank()), но я все же включил его. Если нет необходимости в отдельной нумерации, удалите условные выражения из сумм и добавьте and lowestScores.rn_net <= 4 в предложение where.

; with lowestScores as 
(
    select *, 
     ROW_NUMBER() over (PARTITION by PlayerID 
          order by CONVERT(INT, Net_Score)) rn_net, 
     ROW_NUMBER() over (PARTITION by PlayerID 
          order by CONVERT(INT, Net_Score) + CONVERT(int,In_Score)) rn_gross 
    from tScores        
), 
temp as 
(
    SELECT tTeam.TeamID, 
     tTeam.Title AS Team, 
     SUM(CASE WHEN rn_net <= 4 THEN CONVERT(INT, lowestScores.Net_Score) END) AS NetScore, 
     SUM(CASE WHEN rn_gross <= 4 THEN CONVERT(INT, lowestScores.Out_Score) END 
      + CASE WHEN rn_gross <= 4 THEN CONVERT(int, lowestScores.In_Score) END) AS Gross, 
     rank() OVER (ORDER BY SUM(CASE WHEN rn_net <= 4 THEN CONVERT(INT, lowestScores.Net_Score) END)) rnk, 
     COUNT(*) OVER (PARTITION BY SUM(CASE WHEN rn_net <= 4 THEN CONVERT(INT, lowestScores.Net_Score) END)) cnt 
    FROM lowestScores 
    INNER JOIN tPlayer 
     ON lowestScores.PlayerID = tPlayer.PlayerID 
    INNER JOIN tTeam 
     ON tPlayer.TeamID = tTeam.TeamID 
    WHERE tTeam.TournamentID = 13 
    GROUP BY tTeam.TeamID, tTeam.Title 
) 
SELECT TeamID, Team, NetScore, Gross, 
     CASE WHEN cnt > 1 
      THEN 'T' + CAST(rnk AS VARCHAR(5)) 
      ELSE CAST(rnk AS VARCHAR(5)) 
     END Pos 
    FROM temp 
ORDER BY NetScore, Team 
Смежные вопросы