How to transpose MySQL rows and repeat column headers?

随声附和 提交于 2019-12-23 10:26:50

问题


I have a mysql table that looks like:

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

Is there any sql statement that will output the table as:

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

Thanks all!


回答1:


You could do something like this if those really are the id values:

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

See SQL Fiddle with Demo

Result:

| 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 |

If you cannot rely on the id in the table, then you could add a row number to the records you are returning:

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

See SQL Fiddle with Demo




回答2:


For what you want, to select all rows to insert into one row in Excel. Have as many rows in your table as you like.

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

Returns CSV:

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


来源:https://stackoverflow.com/questions/14167719/how-to-transpose-mysql-rows-and-repeat-column-headers

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!