2013-02-08 52 views
0

我有2个表,我想加入标题和准备好的声明中的第一列。我已经设法加入专栏,但是如何加入标题?准备好的声明:如何加入标题

表1:

ID |Name 
---------- 
    1 | A 
    2 | B 
    3 | C 
    4 | D 
    5 | E 

表2:

TeamA|TeamB|Won|Lost 
-------------------- 
    1 | 2 | 5 | 3 
    1 | 3 | 2 | 4 
    1 | 4 | 9 | 1 
    2 | 5 | 5 | 5 
    3 | 1 | 2 | 4 

结果矩阵:

 | A | B | C | D | E 
---------------------------- 
    A | 0 | 2 | -2 | 8 | 0 
    B | 0 | 0 | 0 | 0 | 0 
    C | -2 | 0 | 0 | 0 | 0 

SQL Fiddle

+1

如果表1的值是静态的一个案例陈述将起作用。否则,您正在使用动态SQL,或使用PHP/GUI重新定位数据。或..类似的东西:http://stackoverflow.com/questions/11981891/dynamic-cross-tab-in-mysql会工作。在“数据透视”,“交叉表”,“动态” – xQbert 2013-02-08 19:37:33

回答

0

为了从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 |