1

私はスポーツ データベースに取り組んでおり、特定のカテゴリの名前と統計値を返すクエリを作成したいと考えています。たとえば、ゴール リーダー、アシスト リーダー、ポイント リーダー、+/- リーダー、ペナルティ ミニッツ リーダーなどです。特定のチームの選手名と統計を含む NJDSkaters というテーブルを使用しています。クエリコードは次のとおりです。

SELECT CONCAT(PlayerName,' - ',Goals) AS GoalLeader, CONCAT(PlayerName,' - ',Assists)
    CONCAT(PlayerName,' - ',Points) AS PointsLeader
FROM NJDSkaters
WHERE Goals = (SELECT DISTINCT MAX(Goals) FROM NJDSkaters)
    OR Assists = (SELECT DISTINCT MAX(Assists) FROM NJDSkaters)
    OR Points = (SELECT DISTINCT MAX(Points) FROM NJDSkaters);

これは、このクエリによって返される必要があるプレーヤーを示す私のスケーター レジスタ テーブルのスニペットです。

http://imgur.com/T8gi368

ご覧のとおり、目的のリターン クエリでは、GoalLeader として「Ilya Kovalchuk - 37」、AssistLeader として「Patrik Elias - 52」、PointLeader として「Ilya Kovalchuk - 83」が返されます。クエリを実行するとこれらの結果が得られますが、ここに示すように、私が望まない追加情報が含まれています。

http://imgur.com/UUxM2yA

私の質問は、どうすれば余分な情報を取り除くことができますか? 各カテゴリのリーダーだけが必要で、他のカテゴリで 1 位であっても 2 位のプレイヤーはリストに表示されたくありません。基本的に、私が言いたいのは、このテーブルには 1 つの行だけが必要だということです。以前は、リーダーを先頭にしてすべてのプレイヤーを返すコードがあったため、このコードは目的の結果に一歩近づいたのですが、今は行き詰まっています。この問題に対する答えを探すことは、一般的に質問する方法を見つけるのが難しいため、困難でした。

4

2 に答える 2

1

データを PIVOT する必要があります。次のようなものを使用します。

SELECT
  MAX(CASE WHEN NJDSkaters.Goals=mx.goals
       THEN CONCAT(PlayerName,' - ', NJDSkaters.Goals) END) GoalLeader,
  MAX(CASE WHEN NJDSkaters.Assists=mx.assists
       THEN CONCAT(PlayerName,' - ', NJDSkaters.Assists) END) AssistsLeader,
  MAX(CASE WHEN NJDSkaters.Points=mx.points
       THEN CONCAT(PlayerName,' - ', NJDSkaters.Points) END) PointsLeader
FROM
  NJDSkaters INNER JOIN (
    SELECT MAX(Goals) goals, MAX(Assists) assists, MAX(Points) points
    FROM NJDSkaters) mx
  ON NJDSkaters.Goals=mx.goals
     OR NJDSkaters.Assists=mx.assists
     OR NJDSkaters.Points=mx.points

ここでフィドルを参照してください。複数のプレイヤーが同じ最大値を共有している場合は、MAX の代わりに GROUP_CONCAT を使用することもできます。

SELECT
  CONCAT(GROUP_CONCAT(CASE WHEN  NJDSkaters.Goals=mx.goals
       THEN PlayerName END), ' - ', mx.goals) GoalLeader,
  CONCAT(GROUP_CONCAT(CASE WHEN NJDSkaters.Assists=mx.assists
       THEN PlayerName END), ' - ', mx.assists) AssistsLeader,
  CONCAT(GROUP_CONCAT(CASE WHEN NJDSkaters.Points=mx.points
       THEN PlayerName END), ' - ', mx.points) PointsLeader
FROM
  NJDSkaters INNER JOIN (
    SELECT MAX(Goals) goals, MAX(Assists) assists, MAX(Points) points
    FROM NJDSkaters) mx
  ON NJDSkaters.Goals=mx.goals
     OR NJDSkaters.Assists=mx.assists
     OR NJDSkaters.Points=mx.points

少し説明:

  • サブクエリmxは、最大ゴール数、最大アシスト数、および最大ポイントを返します。
  • このサブクエリでテーブルNJDSkatersを結合して、最大ゴール数または最大アシスト数または最大ポイントを持つすべての行を返します
  • CASE WHEN NJDSkaters.Goals=mx.goals THEN PlayerName ENDPlayerNameそのプレーヤーが最大数のゴールを持っている場合は を返し、それ以外の場合は NULL を返します。アシストやポイントも同様です。
  • GROUP_CONCAT を使用して、CASE WHEN によって返されたすべてのプレイヤー名を連結しています。GROUP_CONCAT は NULL 値をスキップし、カテゴリの最大値を持つプレーヤーのみを連結します
  • CONCAT を使用して、上記の GROUP_CONCAT によって返された文字列を各カテゴリの最大値と連結しています。
于 2013-04-16T20:19:52.293 に答える
0

LIMIT 1 を使用して結果を制限しないのはなぜですか?

于 2013-04-16T20:14:51.917 に答える