想从表中的2个不同的行中检索1条记录

时间:2013-09-14 16:30:09

标签: sql sql-server sql-server-2008-r2

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

enter image description here

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

enter image description here

我找到了一个有效的查询,但它看起来效率不高。此外,我可能在将来需要打破并添加另一个记录,其中添加了新的排名类型,例如组中的“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'

先谢谢。

2 个答案:

答案 0 :(得分:2)

只需一个简单的自我加入

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' 

DEMO

如果您需要新的G类型,则将另一个左连接和新字段添加到选择

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

DEMO

答案 1 :(得分: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

看起来你的第二个记录集中还有一个拼写错误 - 第一组记录集中的Dlosses = 2,第二记录集中的Dlosses = 1。