带汇总和前三列的SQL Self Join

时间:2019-04-21 16:40:55

标签: sql sql-server join

尝试在一个查询中做很多事情。不确定我应该执行不同的子查询还是一组联接。

它正在Microsoft Azure上的SQL数据库应用程序上运行。

表/视图为:

TourmamentID  INT
EventID INT
EventName NVARCHAR(50)
TeamID INT
TeamName NVARCHAR(50)
EventStart Datetime
TeamEnd Datetime
iscomplete bit

这是视图中的示例数据。

TournamentID, EventName, TeamName, EventStart, TeamEnd, iscomplete     
---------- --------  ----------  -------  ---------     -------    
1             E1           T1       sqldate     sqldate    1    
1             E2           T1       sqldate     sqldate    1    
1             E1           T2       sqldate     sqldate    1
1             E2           T2       sqldate     sqldate    1
1             E1           T3       sqldate     sqldate    1
2             E1           T1       sqldate     null       null
2             E1           T2       sqldate     sqldate    1
2             E2           T2       sqldate     sqldate    1
3             E1           T3       sqldate     null       null

我需要显示一个积分榜结果集,该结果集将以最快的前三名列为完成活动的团队总数。拥有团队名称和时间是最好的。

EventName,  NumberTeamscompleted,   1st             2nd           3rd    
E1           3                      Datediff (T1)    DateDiff (T3) DateDiff(T2)    
E2           2        

查询将仅返回单个锦标赛(其中tournamentID = 1)的结果

我已经在表上进行了自我联接,以获取多于一组的结果列,但我还没有能力使第二组成为每个事件第二快的列。

我还有一个独立的查询,该查询进行计数和分组,按顺序进行求和,但是当我尝试将它们合并时,一切都崩溃了。

1 个答案:

答案 0 :(得分:1)

您可以使用条件聚合:

select tournamentid, teamname,
       count(*) as num_completed,
       max(case when seqnum = 1 then teamname end) as team_1,
       max(case when seqnum = 2 then teamname end) as team_2,
       max(case when seqnum = 3 then teamname end) as team_3
from (select t.*,
             row_number() over (partition by tournamentid, teamname
                                order by datediff(day, teamstart, teamend)
                               ) as seqnum
      from t
      where iscomplete = 1
     ) t
group by tournamentid, teamname;