Istnieją dwa sposoby obracania dane w MySQL. Jeśli znasz wartości z wyprzedzeniem (zespoły), wtedy zakodujesz je na stałe lub możesz użyć przygotowanej instrukcji do wygenerowania dynamicznego sql.
Wersja statyczna to:
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;
Zobacz SQL Fiddle z wersją demonstracyjną
Jeśli chcesz użyć wersji dynamicznej z przygotowanym oświadczeniem, kod będzie wyglądał następująco:
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;
Zobacz SQL Fiddle z wersją demonstracyjną .
Edycja #1, po zastanowieniu się nad tym, zrobiłbym to trochę inaczej. Wygenerowałbym prawdziwą macierz danych, w których drużyny pojawiły się zarówno w rzędzie, jak iw kolumnie. Aby to zrobić, użyj najpierw UNION ALL
zapytanie, aby uzyskać wszystkie zespoły w dwóch kolumnach:
select teama Team1, teamb Team2,
won-lost Total
from yourtable
union all
select teamb, teama,
won-lost
from yourtable
Zobacz SQL Fiddle z wersją demonstracyjną . Gdy to zrobisz, możesz obrócić dane:
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;
Zobacz SQL Fiddle z wersją demonstracyjną . Co daje bardziej szczegółowy wynik:
| 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 |