MySQL:将列转换为行

时间:2013-03-26 21:57:48

标签: mysql sql

我需要将大量的colums转换为行。

我有3个主要类别(CAT,ODB和GPA) 每个类别有一个月(从1月到12月),每个类别有一年) 以下是结构示例:

  

CATJAN2002 | CATFEB2002 ... | CATDEC2002 ... | ODBJAN2003 ... | GPAMAR2013

在vba中我可以创建一个简单的循环,将这些数据导出到另一个表中:

New_Table个字段: ID, TYPE, YEAR, MONTH, VALUE 。你能帮我找到一种方法来自动思考表的列并开始将数据输入到新表中吗?这可以单独在MySQL中完成吗?

我忘了指出第一列(STORE,ITEM和CUSTOMER)的组合是ID(或主键)[SELECT CONCAT(STORE, ITEM, CUSTOMER) AS ID

1 个答案:

答案 0 :(得分:2)

我们的想法是使用这样的查询:

SELECT CONCAT(STORE, ITEM, CUSTOMER) ID,
       'CAT' TYPE, 2002 YEAR, 'JAN' MONTH, CATJAN2002 VALUE
FROM yourtable
UNION ALL
SELECT CONCAT(STORE, ITEM, CUSTOMER) ID,
       'CAT' TYPE, 2002 YEAR, 'FEB' MONTH, CATFEB2002 VALUE
FROM yourtable
UNION ALL
...

你可以使用动态查询来创建它,如下所示:

SELECT
  GROUP_CONCAT(
  CONCAT(
    'SELECT CONCAT(STORE, ITEM, CUSTOMER) ID,',
    '\'',
    LEFT(column_name, 3),
    '\' TYPE,',
    RIGHT(column_name, 4),
    ' YEAR, \'',
    SUBSTR(column_name, 4, 3),
    '\' MONTH,',
    column_name,
    ' VALUE FROM yourtable')
  SEPARATOR ' UNION ALL ')
FROM information_schema.COLUMNS
where
  table_name = 'yourtable'
  AND (column_name LIKE 'CAT%' OR column_name LIKE 'ODB%' OR column_name LIKE 'GPA%')
INTO @sql;

prepare stm from @sql;
execute stm;

请参阅小提琴here