为了从ID中获得团队名称,您必须两次参加表格。
如果你知道所有的值,该代码的静态版本是:
select a.name teamA,
max(case when b.name = 'A' then won - lost else 0 end) as A,
max(case when b.name = 'B' then won - lost else 0 end) as B,
max(case when b.name = 'C' then won - lost else 0 end) as C,
max(case when b.name = 'D' then won - lost else 0 end) as D,
max(case when b.name = 'E' then won - lost else 0 end) as E
from yourtable t
left join teams a
on t.teama = a.id
left join teams b
on t.teamb = b.id
group by a.name;
见SQL Fiddle with Demo。
然后,如果你使用的是准备好的声明中动态创建此,该代码将是:
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 a.name TeamA,
b.name TeamB,
t.won,
t.lost
from yourtable t
left join teams a
on t.teama = a.id
left join teams b
on t.teamb = b.id
order by teamb
) x;
SET @sql
= CONCAT('SELECT TeamA, ', @sql, '
from
(
select a.name TeamA,
b.name TeamB,
t.won,
t.lost
from yourtable t
left join teams a
on t.teama = a.id
left join teams b
on t.teamb = b.id
) s
group by TeamA');
PREPARE stmt FROM @sql;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
见SQL Fiddle with Demo
结果是:
| TEAMA | A | B | C | D | E |
------------------------------
| A | 0 | 2 | 0 | 8 | 0 |
| B | 0 | 0 | 0 | 0 | 0 |
| C | -2 | 0 | 0 | 0 | 0 |
如果表1的值是静态的一个案例陈述将起作用。否则,您正在使用动态SQL,或使用PHP/GUI重新定位数据。或..类似的东西:http://stackoverflow.com/questions/11981891/dynamic-cross-tab-in-mysql会工作。在“数据透视”,“交叉表”,“动态” – xQbert 2013-02-08 19:37:33