Có hai cách mà bạn có thể xoay trục dữ liệu trong MySQL. Nếu bạn biết trước các giá trị (nhóm) thì bạn sẽ mã hóa các giá trị đó hoặc bạn có thể sử dụng một câu lệnh đã chuẩn bị để tạo sql động.
Phiên bản tĩnh sẽ là:
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;
Nếu bạn muốn sử dụng phiên bản động với câu lệnh đã soạn sẵn, mã sẽ là:
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;
Xem SQL Fiddle with Demo .
Chỉnh sửa # 1, sau khi nghĩ về điều này, tôi thực sự sẽ làm điều này hơi khác một chút. Tôi sẽ tạo một ma trận thực hệ điều hành dữ liệu nơi các nhóm xuất hiện trong cả hàng và cột. Để thực hiện việc này, trước tiên bạn phải sử dụng UNION ALL
truy vấn để nhận tất cả các nhóm trong hai cột:
select teama Team1, teamb Team2,
won-lost Total
from yourtable
union all
select teamb, teama,
won-lost
from yourtable
Xem SQL Fiddle with Demo . Sau khi hoàn tất, bạn sẽ xoay dữ liệu:
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;
Xem SQL Fiddle with Demo . Kết quả chi tiết hơn về:
| 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 |