Er zijn twee manieren waarop u kunt draaien gegevens in MySQL. Als u de waarden van tevoren kent (teams), dan zult u de waarden hardcoderen of u kunt een voorbereide instructie gebruiken om dynamische sql te genereren.
Een statische versie zou zijn:
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;
Als u een dynamische versie met een voorbereide verklaring wilt gebruiken, zou de code zijn:
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;
Zie SQL Fiddle met demo .
Edit #1, na hierover nagedacht te hebben zou ik dit eigenlijk een beetje anders doen. Ik zou een echte matrix genereren van de gegevens waar de teams in zowel de rij als de kolom verschenen. Hiervoor gebruikt u eerst een UNION ALL
query om alle teams in twee kolommen te krijgen:
select teama Team1, teamb Team2,
won-lost Total
from yourtable
union all
select teamb, teama,
won-lost
from yourtable
Zie SQL Fiddle met demo . Als dat eenmaal gedaan is, zou je draaien de gegevens:
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;
Zie SQL Fiddle met demo . Wat een meer gedetailleerd resultaat geeft van:
| 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 |