0

次の表では、SQLステートメントを作成してデータマトリックスまたはビューを作成することは可能ですか?

テーブル:

TeamA|TeamB|Won|Lost
--------------------
  A  |  B  | 5 | 3
  A  |  C  | 2 | 4
  A  |  D  | 9 | 1
  B  |  E  | 5 | 5
  C  |  A  | 2 | 4

結果-マトリックス:

     |  A | B |  C | D | E
----------------------------
  A  |  0 | 2 | -2 | 8 | 0
  B  |  0 | 0 |  0 | 0 | 0
  C  | -2 | 0 |  0 | 0 | 0
4

2 に答える 2

1

MySQL でデータをピボットする方法は 2 つあります。事前に値がわかっている場合 (チーム)、値をハードコーディングするか、準備済みステートメントを使用して動的 SQL を生成できます。

静的バージョンは次のようになります。

select TeamA,
  max(case when TeamB = 'A' then won - lost else 0 end) as A,
  max(case when TeamB = 'B' then won - lost else 0 end) as B,
  max(case when TeamB = 'C' then won - lost else 0 end) as C,
  max(case when TeamB = 'D' then won - lost else 0 end) as D,
  max(case when TeamB = 'E' then won - lost else 0 end) as E
from yourtable
group by TeamA;

デモで SQL Fiddle を参照してください

準備済みステートメントで動的バージョンを使用する場合、コードは次のようになります。

SET @sql = NULL;
SELECT
  GROUP_CONCAT(DISTINCT
    CONCAT(
      'MAX(CASE WHEN TeamB = ''',
      TeamB,
      ''' THEN won - lost else 0 END) AS `',
      TeamB, '`'
    )
  ) INTO @sql
from
(
  select *
  from yourtable
  order by teamb
) x;

SET @sql 
  = CONCAT('SELECT TeamA, ', @sql, ' 
           from yourtable
           group by TeamA');

PREPARE stmt FROM @sql;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;

SQL Fiddle with Demoを参照してください。

編集#1、これについて考えた後、実際には少し違うことをします。チームが行と列の両方に表示されるデータに対して、真のマトリックスを生成します。これを行うには、最初にUNION ALLクエリを使用して、2 つの列ですべてのチームを取得します。

select teama Team1, teamb Team2,
  won-lost Total
from yourtable
union all
select teamb, teama,
  won-lost
from yourtable

SQL Fiddle with Demoを参照してください。それが完了したら、データをピボットします。

select Team1,
  coalesce(max(case when Team2 = 'A' then Total end), 0) as A,
  coalesce(max(case when Team2 = 'B' then Total end), 0) as B,
  coalesce(max(case when Team2 = 'C' then Total end), 0) as C,
  coalesce(max(case when Team2 = 'D' then Total end), 0) as D,
  coalesce(max(case when Team2 = 'E' then Total end), 0) as E
from
(
  select teama Team1, teamb Team2,
    won-lost Total
  from yourtable
  union all
  select teamb, teama,
    won-lost
  from yourtable
) src
group by Team1;

SQL Fiddle with Demoを参照してください。これにより、次のより詳細な結果が得られます。

| TEAM1 |  A | B |  C | D | E |
-------------------------------
|     A |  0 | 2 | -2 | 8 | 0 |
|     B |  2 | 0 |  0 | 0 | 0 |
|     C | -2 | 0 |  0 | 0 | 0 |
|     D |  8 | 0 |  0 | 0 | 0 |
|     E |  0 | 0 |  0 | 0 | 0 |
于 2013-02-08T14:45:33.697 に答える
1

可変数の列を持つ SQL ステートメントまたはビューを作成することはできません。標準 SQL では、次のようにしてデータをピボットできます。

select TeamA,
       max(case when TeamB = 'A' then won - lost end) as A,
       max(case when TeamB = 'B' then won - lost end) as B,
       max(case when TeamB = 'C' then won - lost end) as C,
       max(case when TeamB = 'D' then won - lost end) as D,
       max(case when TeamB = 'E' then won - lost end) as E
from t
group by TeamA
order by 1

一部のデータベースはピボット ステートメントをサポートしています。

これを一般的に行うには、SQL ステートメントを文字列として作成し、それを実行する必要があります (多くの場合、動的SQL と呼ばれます)。このようなステートメントは、SQL、ストアド プロシージャ、Excel、またはその他のプログラミング ツールで作成できます。その後、実行する必要があります。

繰り返しますが、特定の SQL ステートメントには、定義済みの一連の列があります。列数を変更することはできません。

于 2013-02-08T14:15:57.707 に答える