3

次の MS SQL クエリを使用して、3 つのテーブル (tTeam、tPlayer、および tScores) を相互参照して、合計「ネット スコア」、「総スコア」、および「ポジション」をネット スコアとチームで並べ替えて取得します。

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人の最低プレーヤーのネットおよびグロススコア」を計算するだけでよいのに、チームごとにすべてのプレーヤーのネットおよびグロススコアを計算していますそれだけ。

私はこれで髪を引っ張るのに最後の1日半を費やしました。どんな助けでも大歓迎です.

前もって感謝します!

4

1 に答える 1

0

プレーヤーごとに 4 つの最低スコアのみを合計したいということを正しく理解していれば、別の 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
于 2012-09-08T00:09:11.947 に答える