1

我有一个包含列和行的表(注意团队 id 2 没有 D 记录)

在此处输入图像描述

我需要的是一个查询,它允许我为每个团队 ID 检索 1 条记录,其列名基于类型(在本例中为 O 或 D),例如:

在此处输入图像描述

我找到了一个有效的查询,但它似乎效率不高。另外,我将来可能需要打破并拥有另一个记录,其中添加了新的排名类型,例如“G”代表小组。

SELECT  s.StandingsId,
    s.StandingsTypeId,
    s.TeamId,
    s.Wins,
    s.Losses,
    s.Ties,
    s.SortOrder,
    s.WinLossPct,
    (select
       ds.Wins
        FROM Standings AS ds
            WHERE ds.StandingsTypeId = 'D'
              AND ds.TeamId = s.TeamId) AS DivisionWins,
   (select
      ds.Losses
        FROM Standings AS ds
            WHERE ds.StandingsTypeId = 'D'
              AND ds.TeamId = s.TeamId) AS DivisionLosses,
   (select
      ds.Ties
        FROM Standings AS ds
            WHERE ds.StandingsTypeId = 'D'
              AND ds.TeamId = s.TeamId) AS DivisionTies,

   (select
      ds.WinLossPct
        FROM Standings AS ds
            WHERE ds.StandingsTypeId = 'D'
              AND ds.TeamId = s.TeamId) AS dWinLossPct,

    t.TeamName,
    t.ConferenceId,
    t.DivisionId,
    t.GroupId
  FROM Standings s

  LEFT JOIN Team t ON
            s.TeamId = t.TeamId 
   WHERE s.StandingsTypeId = 'O'

提前致谢。

4

2 回答 2

2

您只需要一个简单的 SELF JOIN

SELECT o.id, 
       o.teamid, 
       o.wins   Owins, 
       o.losses olosses, 
       o.winpct owinpct, 
       d.wins   dwins, 
       d.losses dlossses, 
       d.winpct dwinpct 
FROM   standings o 
       LEFT JOIN standings d 
              ON o.teamid = d.teamid 
                AND d.type = 'D' 
WHERE o.type = 'O' 

演示

如果你需要一个新类型 G 你添加另一个左连接和新字段到选择

   LEFT JOIN standings g 
          ON o.teamid = g.teamid 
            AND g.type = 'G' 

演示

于 2013-09-14T16:57:54.933 回答
1

看起来你只需要将一些行变成列,就像这样。

select
    s.TeamId,
    max(case when s.Type = 'O' then s.Wins end) as OWins,
    max(case when s.Type = 'O' then s.Losses end) as OLosses,
    max(case when s.Type = 'O' then s.WinPCT end) as OWinPCT,
    max(case when s.Type = 'D' then s.Wins end) as DWins,
    max(case when s.Type = 'D' then s.Losses end) as DLosses,
    max(case when s.Type = 'D' then s.WinPCT end) as DWinPCT
from Standings as s
group by s.TeamId

sql fiddle demo

看起来您的第二个记录集中也有错字 - 团队 1 在第一个记录集中有 Dlosses = 2,在第二个记录集中有 Dlosses = 1。

于 2013-09-14T16:35:13.890 回答