2

データベーステーブルには、ゴールアクションが含まれています。

 type      goal      assist
 goal      Johnny    James
 goal      Johnny    James
 goal      James     Bob

GROUP BYゴールを使用する場合は、表示を支援します

 player    goals     assists
 Johnny    2         0
 Johnny    0         0
 James     1         0
 James     0         2
 Bob       0         0
 Bob       0         1

しかし、プレーヤーの目標を示し、1行でアシストするために必要です。乾杯。

4

2 に答える 2

3

このように行うことができます(ただし、データベースとインデックスのサイズによっては、これが最速のクエリではない場合があります!):

SELECT players.player,
      -- Use correlated subselects to count goals / assists
      (SELECT COUNT(*) FROM actions WHERE goal = players.player) goals
      (SELECT COUNT(*) FROM actions WHERE assist = players.player) assists

-- Get all distinct players (UNION = DISTINCT, here). Of course, if you
-- have an actual players table, use that one instead!
FROM (
  SELECT goal player FROM actions UNION
  SELECT assist      FROM actions
) players

あなたの質問から、私はあなたの質問にtype = goal関連しているかどうかわかりません...

于 2012-04-07T13:52:34.170 に答える
1

考えられる解決策は、最初にプレーヤー名のピボットを解除してから、ピボットでグループ化することです。

SELECT
  Player,
  COUNT(NULLIF(ScoreType, 'assist')) AS goals,
  COUNT(NULLIF(ScoreType, 'goal')) AS assists
FROM (
  SELECT
    CASE s.ScoreType WHEN 'goal' THEN goal ELSE assist END AS Player,
    s.ScoreType
  FROM GoalActions
  CROSS JOIN (
    SELECT 'goal' AS ScoreType
    UNION ALL SELECT 'assist'
  ) st
) s
GROUP BY
  Player

ピボット解除は仮想テーブルへのクロス結合を使用して実行され、グループ化/ピボットはCASEを使用した集約の形式で実装されます。

于 2012-04-07T16:57:35.203 に答える