我有一个包含列和行的表(注意没有团队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'
先谢谢。
答案 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'
如果您需要新的G类型,则将另一个左连接和新字段添加到选择
LEFT JOIN standings g
ON o.teamid = g.teamid
AND g.type = 'G'
答案 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。