4

これらの列を持つテーブルがあります:

  • ID
  • ユーザーID
  • player_in
  • player_out
  • 日にち

player_out フィールドと同様に、player_in フィールドの両方で、各「プレーヤー」の繰り返し回数をカウントするレポートを作成する必要があります。たとえば、テーブルにこの 2 つの行があるとします (それぞれの順序で)。

id user_id player_in player_out
1  1       88        56
2  7       77        88

プレーヤー 88 の結果は 2 になり、プレーヤー 56 と 77 の結果は 1 になります。

4

2 に答える 2

3

union all2 つの列を 1 つの列に取得するサブクエリを使用してから、標準を使用しcount(*)ます。

注:したがって、クエリには、この回答へのコメントでのさらなる要求に従って、インとアウトの個々の合計が含まれていました。

select
  player_id,
  count(*) as total,
  sum(ins) as ins,
  sum(outs) as outs
from (
  select
    player_in as player_id,
    1 as ins,
    0 as outs
  from mytable
  union all
  select player_out, 0, 1
  from mytable
) x
group by player_id

注:は重複を削除しますが、削除しないため、 union all(だけでなくunion) を使用する必要があります。unionunion all

于 2013-07-07T14:48:32.057 に答える
2

次のように、2 行の仮想テーブルへのクロス結合を使用してplayer_*列のピボットを解除し、結果をグループ化できます。

SELECT
  player,
  COUNT(*) AS total_count
FROM (
  SELECT
    CASE WHEN x.is_in THEN t.player_in ELSE t.player_out END AS player
  FROM mytable t
  CROSS JOIN (SELECT TRUE AS is_in UNION ALL SELECT FALSE) x
) s
GROUP BY
  player
;

つまり、元のテーブルのすべての行は基本的に複製され、派生テーブルの列がまたはであるかどうplayer_inかに応じて、行の各コピーが または を提供して、単一の列を形成します。このピボット解除の方法は、@Bohemian によって提案された UNION メソッドよりもパフォーマンスが優れている可能性があります。これは、(物理) テーブルが 1 回だけ渡されるためです (ただし、両方の方法をテストして比較し、このアプローチに実質的な利点があるかどうかを判断する必要があります)。あなたの特定の状況)。player_outis_inTRUEFALSEplayer

上記の回答に対するコメントの1つで要求したように、インとアウトのカウントを計算するには、私の元の提案を次のように拡張できます。

SELECT
  player,
  COUNT(    is_in OR NULL) AS in_count,
  COUNT(NOT is_in OR NULL) AS out_count,
  COUNT(*)                 AS total_count
FROM (
  SELECT
    x.is_in,
    CASE WHEN x.is_in THEN t.player_in ELSE t.player_out END AS player
  FROM mytable t
  CROSS JOIN (SELECT TRUE AS is_in UNION ALL SELECT FALSE) x
) s
GROUP BY
  player
;

ご覧のとおり、派生テーブルはis_in独自の列を追加で返します。この列は、プレイヤーが出入りした回数をカウントするための 2 つの条件付き集計で使用されます。(興味のある方はここでOR NULL裏技を解説しています。)

エントリをのように書き換えることもできます。それは確かに両方の式を短くします。また、より明確でエレガントなカウント方法を見つける人もいます. どちらの場合でも、パフォーマンスに違いはない可能性が高いので、好みに合わせて選択してください。COUNT(condition OR NULL)SUM(condition)SUM

2 番目のクエリの SQL Fiddle デモは、ここにあります。

于 2013-07-10T00:21:59.523 に答える