0

作成しようとしている SQL Server 2012 クエリを特定するのに苦労しており、誰かが助けてくれることを願っています。これは私が現在クエリとして持っているものです:

 --home wins
 select NULL as roadlosses, Count(t1.TeamName) as homewins, t1.TeamName from scores s
 inner join games g
 on g.GameID=s.GameID
 inner join teams t1
 on t1.TeamID=g.HomeTeam
 inner join teams t2
 on t2.Teamid=g.AwayTeam
 where (s.hometotalruns - s.awaytotalruns) > 0 and t1.TeamName = 'Pirates'
 group by t1.teamname

 UNION
 --road losses

 select Count(t2.TeamName) as roadlosses, NULL, t2.TeamName from scores s
 inner join games g
 on g.GameID=s.GameID
 inner join teams t1
 on t1.TeamID=g.HomeTeam
 inner join teams t2
 on t2.Teamid=g.AwayTeam
 where (s.hometotalruns - s.awaytotalruns) > 0 and t2.TeamName = 'Pirates' 
 group by t2.TeamName

これにより、結果は次のようになります。

 roadlosses    homewins     teamname
 NULL            41          Pirates
 26             NULL         Pirates

これで sを削除して 1 行のみを返したいNULLのですが、取得できないようです。

これを見てみましが、私が必要としているものとはまったく異なります。

4

2 に答える 2

2

探しているチーム名がわかっているので、クエリ全体で継続的に参照するのではなく、それを引き出して、メインクエリでチームテーブルにまったく参加する必要がないようにするのが理にかなっていると思います。チーム名が一意である場合 (そうであることを願っています)、これは非常に安価なシークになります。

-- this would be your input parameter:
DECLARE @TeamName VARCHAR(32) = 'Pirates';

-- the rest would be the code:
DECLARE @TeamID INT;
SELECT @TeamID = TeamID FROM dbo.Teams WHERE TeamName = @TeamName;

;WITH x AS 
(
   SELECT 
     location = CASE g.HomeTeam WHEN @TeamID THEN 'H' ELSE 'A' END,
     run_diff = s.hometotalruns - s.awaytotalruns
   FROM dbo.Scores AS s
   INNER JOIN dbo.Games AS g
   ON s.GameID = g.GameID
   WHERE @TeamID IN (g.HomeTeam, g.AwayTeam)
)
SELECT 
 RoadLosses = COUNT(CASE WHEN location = 'A' AND run_diff > 0 THEN 1 END),
 HomeWins   = COUNT(CASE WHEN location = 'H' AND run_diff > 0 THEN 1 END),
 TeamName   = @TeamName  
FROM x;
于 2013-08-13T03:25:17.477 に答える
1

条件付き集計を使用して、これを単一のクエリとして実行します。これがクエリだと思います:

 select sum(case when (s.hometotalruns - s.awaytotalruns) > 0 and t2.TeamName = 'Pirates' 
                 then 1 else 0
            end) as roadlosses,
        sum(case when (s.hometotalruns - s.awaytotalruns) > 0 and t1.TeamName = 'Pirates'
                 then 1 else 0
            end) as homewins,
        'Pirates' as TeamName
 from scores s
 inner join games g
 on g.GameID=s.GameID
 inner join teams t1
 on t1.TeamID=g.HomeTeam
 inner join teams t2
 on t2.Teamid=g.AwayTeam
 where 'Pirates' in (t1.TeamName, t2.teamName);
于 2013-08-13T03:15:38.817 に答える