如何转置MySQL行和重复列标题?

时间:2013-01-05 01:49:31

标签: mysql transpose

我有一个看起来像的mysql表:

id  group_id   item_code  item_label  item_detail    item_score
1   10         BLU123     Blue 123    Blah blah 123  3
2   10         BLU124     Blue 124    Blah blah 124  6
3   10         BLU125     Blue 125    Blah blah 125  2

是否有任何sql语句将表输出为:

group_id   item_code1  item_label1  item_detail1    item_score1  item_code2  item_label2  item_detail2    item_score2  item_code3  item_label3  item_detail3    item_score3
10         BLU123      Blue 123     Blah blah 123   3            BLU124      Blue 124     Blah blah 124   6            BLU125      Blue 125     Blah blah 125   2

全部谢谢!

2 个答案:

答案 0 :(得分:2)

根据需要,选择要在Excel中插入一行的所有行。您可以在表格中添加任意数量的行。

SELECT 
    CONCAT(
        group_id,',', GROUP_CONCAT( 
            CONCAT_WS(',', item_code, item_label, item_detail, item_score) 
        )
    )
FROM thetable

返回CSV:

10,BLU123,Blue 123,Blah blah 123,3,BLU124,Blue 124,Blah blah 124,6,BLU125,Blue 125,Blah blah 125,2

答案 1 :(得分:1)

如果真的是id值,你可以这样做:

select group_id,
  max(case when id = 1 then item_code end) item_code1,
  max(case when id = 1 then item_label end) item_label1,
  max(case when id = 1 then item_detail end) iitem_detail1,
  max(case when id = 1 then item_score end) item_score1,
  max(case when id = 2 then item_code end) item_code2,
  max(case when id = 2 then item_label end) item_label2,
  max(case when id = 2 then item_detail end) iitem_detail2,
  max(case when id = 2 then item_score end) item_score2,
  max(case when id = 3 then item_code end) item_code3,
  max(case when id = 3 then item_label end) item_label3,
  max(case when id = 3 then item_detail end) iitem_detail3,
  max(case when id = 3 then item_score end) item_score3
from yourtable
group by group_id

请参阅SQL Fiddle with Demo

结果:

| GROUP_ID | ITEM_CODE1 | ITEM_LABEL1 | IITEM_DETAIL1 | ITEM_SCORE1 | ITEM_CODE2 | ITEM_LABEL2 | IITEM_DETAIL2 | ITEM_SCORE2 | ITEM_CODE3 | ITEM_LABEL3 | IITEM_DETAIL3 | ITEM_SCORE3 |
---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
|       10 |     BLU123 |    Blue 123 | Blah blah 123 |           3 |     BLU124 |    Blue 124 | Blah blah 124 |           6 |     BLU125 |    Blue 125 | Blah blah 125 |           2 |

如果您不能依赖表格中的id,那么您可以为要返回的记录添加行号:

select group_id,
  max(case when rownum = 1 then item_code end) item_code1,
  max(case when rownum = 1 then item_label end) item_label1,
  max(case when rownum = 1 then item_detail end) iitem_detail1,
  max(case when rownum = 1 then item_score end) item_score1,
  max(case when rownum = 2 then item_code end) item_code2,
  max(case when rownum = 2 then item_label end) item_label2,
  max(case when rownum = 2 then item_detail end) iitem_detail2,
  max(case when rownum = 2 then item_score end) item_score2,
  max(case when rownum = 3 then item_code end) item_code3,
  max(case when rownum = 3 then item_label end) item_label3,
  max(case when rownum = 3 then item_detail end) iitem_detail3,
  max(case when rownum = 3 then item_score end) item_score3
from 
(
  select group_id, item_code, item_detail,
    item_label, item_score,
    @rn:=@rn+1 rownum
  from yourtable, (SELECT @rn:=0) r
  where group_id = 10
  order by id
) src
group by group_id

请参阅SQL Fiddle with Demo