Mysql
 sql >> Database >  >> RDS >> Mysql

Istruzione SQL - Matrice SQL

Ci sono due modi in cui puoi girare dati in MySQL. Se conosci i valori in anticipo (team), allora codificherai i valori oppure puoi utilizzare un'istruzione preparata per generare sql dinamico.

Una versione statica sarebbe:

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;

Vedi SQL Fiddle con demo

Se desideri utilizzare una versione dinamica con un'istruzione preparata, il codice sarebbe:

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;

Vedi SQL Fiddle con demo .

Modifica n. 1, dopo averci pensato, lo farei in modo leggermente diverso. Genererei una vera matrice dei dati in cui le squadre sono apparse sia nella riga che nella colonna. Per fare ciò dovresti prima usare un UNION ALL query per ottenere tutte le squadre in due colonne:

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

Vedi SQL Fiddle con demo . Una volta fatto, allora ruoteresti i dati:

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;

Vedi SQL Fiddle con demo . Il che fornisce un risultato più dettagliato di:

| 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 |