2016-03-19 41 views
-2

basit bir sorgu gibi görünüyor, ancak bunu yapamıyorum, lütfen yardım edin. Bana aşağıdaki gibi bazı kısıtlamalar getirdiler: çoklu alt sorgular ve geçici tablolar kullanma, CTE ve dış uygulama.Spor istatistikleri için TSQL sorgusu Bunu yapamazsınız

And this is the desired result
tablolar şunlardır: Oyun, Takım ve oyuncular.

This is the DB Schema Ben etti ekip 1 için diyelim, çünkü her takımın çoğu değerli oyuncusu nasıl filtrelemek mümkün değilim: Oyuncu 1 2 kez MVP kazandı Oyuncu 2 kazandı 5 kez ve Oyuncu 3 kazan 1 kez MVP

ve hepsini görüyorum, sadece en çok kazanan oyuncu 2'yi görmem gerek.

Bugüne kadar yapmış sorgu

:

SELECT 
     q.Name, 
     q.Stadium, 
     q.Logo, 
     COUNT(q.Played) as Played, 
     SUM(q.PlayedAtHome) as [Played Home], 
     SUM(q.PlayedAway) as [Played Away], 
     SUM(q.Won) as Won, 
     SUM(q.Lost) as Lost, 
     MAX(q.BigestWon) as BigestWon, 
     q.MVP, 
     Max(mvpXtimes) mvcXtimes 
FROM 
(
SELECT homeTeam.Name, 
     homeTeam.Stadium, 
     homeTeam.Logo, 
     1 as Played, 
     1 as PlayedAtHome, 
     0 as PlayedAway, 
     mvp.Name as MVP, 
     COUNT(mvp.Name) as mvpXtimes, 
     CASE 
      WHEN (g.HomeScore > g.AwayScore) THEN 1 
      ELSE 0 
     END as Won, 
     CASE 
      WHEN (g.HomeScore < g.AwayScore) THEN 1 
      ELSE 0 
     END as Lost, 
     CASE 
      WHEN (g.HomeScore > g.AwayScore) THEN g.HomeScore 
      ELSE 0 
     END as BigestWon, 
     CASE 
      WHEN (g.HomeScore < g.AwayScore) THEN g.HomeScore 
      ELSE 0 
     END as LostScoreLoser 
FROM dbo.Games as g 
     -- Home team 
     INNER JOIN dbo.Teams homeTeam 
     ON g.HomeTeamID = homeTeam.TeamID 
     -- Mvp of the game 
     INNER JOIN dbo.Players as mvp 
     ON g.MVPPlayerID = mvp.PlayerID 
WHERE g.HomeTeamID = 8 
group by homeTeam.Name, 
     homeTeam.Stadium, 
     homeTeam.Logo, 
     mvp.Name, 
     CASE 
      WHEN (g.HomeScore > g.AwayScore) THEN 1 
      ELSE 0 
     END, 
     CASE 
      WHEN (g.HomeScore < g.AwayScore) THEN 1 
      ELSE 0 
     END, 
     CASE 
      WHEN (g.HomeScore > g.AwayScore) THEN g.HomeScore 
      ELSE 0 
     END, 
     CASE 
      WHEN (g.HomeScore < g.AwayScore) THEN g.HomeScore 
      ELSE 0 
     END 
UNION ALL 

SELECT awayTeam.Name, 
     awayTeam.Stadium, 
     awayTeam.Logo, 
     1 as Played, 
     0 as PlayedAtHome, 
     1 as PlayedAway, 
     mvp.Name as MVP, 
     COUNT(mvp.Name) as mvpXtimes, 
     CASE 
      WHEN (g.AwayScore > g.HomeScore) THEN 1 
      ELSE 0 
     END as Won, 
     CASE 
      WHEN (g.AwayScore < g.HomeScore) THEN 1 
      ELSE 0 
     END as Lost, 
     CASE 
      WHEN (g.AwayScore > g.HomeScore) THEN g.AwayScore 
      ELSE 0 
     END as BigestWon, 
     CASE 
      WHEN (g.AwayScore < g.HomeScore) THEN g.AwayScore 
      ELSE 0 
     END as LostScoreLoser 
FROM dbo.Games as g 
     -- Away team 
     INNER JOIN dbo.Teams awayTeam 
     ON g.AwayTeamID = awayTeam.TeamID 
     -- Mvp of the game 
     INNER JOIN dbo.Players as mvp 
     ON g.MVPPlayerID = mvp.PlayerID 
WHERE g.AwayTeamID = 8 
group by awayTeam.Name, 
     awayTeam.Stadium, 
     awayTeam.Logo, 
     mvp.Name, 
     CASE 
      WHEN (g.AwayScore > g.HomeScore) THEN 1 
      ELSE 0 
     END, 
     CASE 
      WHEN (g.AwayScore < g.HomeScore) THEN 1 
      ELSE 0 
     END, 
     CASE 
      WHEN (g.AwayScore > g.HomeScore) THEN g.AwayScore 
      ELSE 0 
     END, 
     CASE 
      WHEN (g.AwayScore < g.HomeScore) THEN g.AwayScore 
      ELSE 0 
     END 
) as q 
GROUP BY q.Name, 
    q.Stadium, 
    q.Logo , 
    q.MVP 
+1

Özür dileriz, SO ödevleriniz için aldatma aracı değildir. Ayrıca, ödeviniz "CTE ve dış uygulama kullanın" diyor, ancak kodunuzda ne CTE ne de bir dış uygulama görüyorum. –

+0

Lütfen kendi başına bir şeyler yapmaya çalışın, tekrarlayın ve sadece gerçekten sıkışmış olduğunuzda, o zaman buraya sorun. –

+0

3 gün boyunca bu sorguyu deniyorum. Sorunumda neyin yanlış olduğunu anlamıyorum, neyse teşekkürler – MarcosF8

cevap

0

Ben miselft tarafından yaptım verimli eğer, emin değilim ama çalışır:

WITH 
cteGames (TeamID, GameDateTime, Played, PlayedHome, PlayedAway, Won, Lost, BigestWon, BigestLost) 
AS 
    (  
    SELECT 
     q.TeamID, 
     MAX(q.GameDateTime) as GameDateTime, 
     COUNT(q.Played) as Played, 
     SUM(q.PlayedHome) as PlayedHome, 
     SUM(q.PlayedAway) as PlayedAway, 
     SUM(q.Won) as Won, 
     SUM(q.Lost) as Lost, 
     MAX(q.BigestWon) as BigestWon, 
     MAX(q.BigestLost) as BigestLost 
    FROM 
    (
     -- Home team 
     SELECT  
        g.HomeTeamID as TeamID, 
        g.GameDateTime, 
        1 as Played, 
        1 as PlayedHome, 
        0 as PlayedAway, 
        CASE 
         WHEN (g.HomeScore > g.AwayScore) THEN 1 
         ELSE 0 
        END as Won, 
        CASE 
         WHEN (g.HomeScore < g.AwayScore) THEN 1 
         ELSE 0 
        END as Lost, 
        CASE 
         WHEN (g.HomeScore > g.AwayScore) THEN g.HomeScore - g.AwayScore 
         ELSE 0 
        END as BigestWon, 
        CASE 
         WHEN (g.HomeScore < g.AwayScore) THEN g.AwayScore - g.HomeScore 
         ELSE 0 
        END as BigestLost 
     FROM dbo.Games as g 
       INNER JOIN dbo.Teams homeTeam 
       ON g.HomeTeamID = homeTeam.TeamID 

     UNION ALL 

     -- Away team 
     SELECT 
       g.AwayTeamID as TeamID, 
       g.GameDateTime, 
       1 as Played, 
       0 as PlayedHome, 
       1 as PlayedAway, 
       CASE 
        WHEN (g.AwayScore > g.HomeScore) THEN 1 
        ELSE 0 
       END as Won, 
       CASE 
        WHEN (g.AwayScore < g.HomeScore) THEN 1 
        ELSE 0 
       END as Lost, 
       CASE 
        WHEN (g.AwayScore > g.HomeScore) THEN g.AwayScore - g.HomeScore 
        ELSE 0 
       END as BigestWon, 
       CASE 
        WHEN (g.AwayScore < g.HomeScore) THEN g.HomeScore - g.AwayScore 
        ELSE 0 
       END as BigestLost 
     FROM dbo.Games as g 
       INNER JOIN dbo.Teams awayTeam 
       ON g.AwayTeamID = awayTeam.TeamID 
    ) q 
    GROUP BY q.TeamID 

) 

SELECT t.Name, t.Stadium, t.Logo, cte.Played, cte.PlayedHome,     cte.PlayedAway, cte.Won, cte.Lost, bw.Score as BigestWon, bl.Score as BigestLost, cte.GameDateTime, a.Name as MVP 
FROM dbo.Teams as t 
    INNER JOIN cteGames cte 
    ON t.TeamID = cte.TeamID 
CROSS APPLY 
(
    -- MVP part 
    SELECT TOP 1 
     p.Name 
    FROM games as g 
     INNER JOIN dbo.Players as p 
     ON g.MVPPlayerID = p.PlayerID 
     INNER JOIN dbo.Team_Player as tp 
     ON p.PlayerID = tp.PlayerID 
    WHERE tp.TeamID = t.TeamID 
    GROUP BY p.Name 
    ORDER BY COUNT(g.MVPPlayerID) DESC 
) a 
CROSS APPLY 
dbo.fn_GetBigestWin (T.TeamID) as bw 
CROSS APPLY 
dbo.fn_GetBigestLost(T.TeamID) as bl 


ALTER FUNCTION [dbo].[fn_GetBigestWin] 
(
    @teamId INT 
) 
RETURNS TABLE 
AS 
RETURN 
( 
SELECT 
     TOP 1 
     a.GameID, 
     a.Score 
FROM 
     (
       SELECT 
        g.GameID, 
        g.HomeScore - g.AwayScore as ScoreDifference, 
        RTRIM(LTRIM(STR(g.HomeScore))) + '-' + RTRIM(LTRIM(STR(g.AwayScore))) as Score 
       FROM games as g 
       WHERE g.HomeTeamID = @teamId 
        and g.HomeScore > g.AwayScore 

       UNION ALL 

       SELECT 
        g.GameID, 
        g.AwayScore - g.HomeScore as ScoreDifference, 
        RTRIM(LTRIM(STR(g.AwayScore))) + '-' + RTRIM(LTRIM(STR(g.HomeScore))) as Score 
       FROM games as g 
       WHERE g.AwayTeamID = @teamId 
        and g.AwayScore > g.HomeScore 
     ) a 
GROUP BY a.GameID, 
      a.Score 
ORDER BY MAX(a.ScoreDifference) DESC 
) 


ALTER FUNCTION [dbo].[fn_GetBigestLost] 
(
    @teamId INT 
) 
RETURNS TABLE 
AS 
RETURN 
    ( 
    SELECT 
      TOP 1 
      a.GameID, 
      a.Score 
    FROM 
      (
        SELECT 
         g.GameID, 
         g.AwayScore - g.HomeScore as ScoreDifference, 
         RTRIM(LTRIM(STR(g.HomeScore))) + '-' + RTRIM(LTRIM(STR(g.AwayScore))) as Score 
        FROM games as g 
        WHERE g.HomeTeamID = @teamId 
         and g.HomeScore < g.AwayScore 

        UNION ALL 

        SELECT 
         g.GameID, 
         g.HomeScore - g.AwayScore as ScoreDifference, 
         RTRIM(LTRIM(STR(g.AwayScore))) + '-' + RTRIM(LTRIM(STR(g.HomeScore))) as Score 
        FROM games as g 
        WHERE g.AwayTeamID = @teamId 
         and g.AwayScore < g.HomeScore 
      ) a 
    GROUP BY a.GameID, 
       a.Score 
    ORDER BY MAX(a.ScoreDifference) DESC 
    )