1

列と行を持つテーブルがあります (チーム ID 2 の D レコードがないことに注意してください)

ここに画像の説明を入力

必要なのは、次のようなタイプ (この場合は O または D) に基づく列名を使用して、チーム ID ごとに 1 つのレコードを取得できるクエリです。

ここに画像の説明を入力

機能するクエリを見つけましたが、あまり効率的ではないようです。また、将来的には、グループの「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

2 番目のレコードセットにもタイプミスがあるようです。チーム 1 は、最初のレコード セットで Dlosses = 2、2 番目のレコード セットで Dlosses = 1 です。

于 2013-09-14T16:35:13.890 に答える