Es gibt zwei Möglichkeiten zum Pivotieren Daten in MySQL. Wenn Sie die Werte im Voraus kennen (Teams), werden Sie die Werte fest codieren oder Sie können eine vorbereitete Anweisung verwenden, um dynamisches SQL zu generieren.
Eine statische Version wäre:
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;
Siehe SQL Fiddle mit Demo
Wenn Sie eine dynamische Version mit einer vorbereiteten Anweisung verwenden möchten, wäre der Code:
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;
Siehe SQL Fiddle mit Demo .
Bearbeiten # 1, nachdem ich darüber nachgedacht habe, würde ich das tatsächlich ein bisschen anders machen. Ich würde eine echte Matrix aus den Daten generieren, in der die Teams sowohl in der Zeile als auch in der Spalte erscheinen. Dazu würden Sie zuerst ein UNION ALL
verwenden Abfrage, um alle Teams in zwei Spalten abzurufen:
select teama Team1, teamb Team2,
won-lost Total
from yourtable
union all
select teamb, teama,
won-lost
from yourtable
Siehe SQL Fiddle mit Demo . Sobald dies erledigt ist, würden Sie schwenken die Daten:
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;
Siehe SQL Fiddle mit Demo . Das ergibt ein detaillierteres Ergebnis von:
| 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 |