需要有关多个日期列的mysql中的unpivot的帮助

时间:2017-08-03 21:53:20

标签: mysql

enter image description here

这是我的意见。 我想看看我的输出如下:(我正在尝试在Domo中进行mysql数据转换的转换)

Product Type, Date, Revenue

A, 12-31-2015, 100
B, 12-31-2015, 0
C, 12-31-2015, 200
D, 12-31-2015, 300
E, 12-31-2015, 400 
A, 01-31-2016, 400
B, 01-31-2016, 86.88
C, 01-31-2016, 400 
D, 01-31-2016, 55
E, 01-31-2016, 455

等等

我正在尝试使用存储过程:

create PROCEDURE unpivot_cols()
BEGIN
SET @sql = NULL;
SELECT GROUP_CONCAT(DISTINCT
CONCAT('select `Product Type`, ' '''', COLUMN_NAME, ''' col, ', column_name, ' as value from testing_unpivot'
) separator ' union all '
) INTO @sql
FROM INFORMATION_SCHEMA.COLUMNS
where table_name = 'testing_unpivot'
and column_name <> 'Product Type';
set @sql = CONCAT(@sql);
PREPARE stmt FROM @sql;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
END

当我尝试执行上述程序时,我看不到输出。谁能帮我? PS:我尝试使用堆栈溢出时提供的所有帮助。但非对我的情况有帮助。

1 个答案:

答案 0 :(得分:1)

我在MySQL 8.0.1上测试了以下内容:

SELECT GROUP_CONCAT(
  CONCAT(
    'SELECT `Product Type`, ', 
       QUOTE(COLUMN_NAME), ' AS `Date`, ',
       '`', COLUMN_NAME, '` AS `Revenue` ',
    'FROM testing_unpivot'
  ) SEPARATOR ' UNION ALL '
)
FROM INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_NAME = 'testing_unpivot'
AND COLUMN_NAME <> 'Product Type';

使用QUOTE() function会更简单,因为它无需弄清楚三重与四重引号。

输出:

SELECT `Product Type`, '01-31-2016' AS `Date`, `01-31-2016` AS `Revenue` FROM testing_unpivot 
UNION ALL 
SELECT `Product Type`, '02-29-2016' AS `Date`, `02-29-2016` AS `Revenue` FROM testing_unpivot 
UNION ALL 
SELECT `Product Type`, '12-31-2015' AS `Date`, `12-31-2015` AS `Revenue` FROM testing_unpivot

然后我复制了&amp;粘贴以运行该查询并获得此输出:

+--------------+------------+---------+
| Product Type | Date       | Revenue |
+--------------+------------+---------+
| A            | 01-31-2016 |  400.00 |
| B            | 01-31-2016 |   86.88 |
| C            | 01-31-2016 |  400.00 |
| D            | 01-31-2016 |   55.00 |
| E            | 01-31-2016 |  455.00 |
| A            | 02-29-2016 |   55.00 |
| B            | 02-29-2016 |   55.00 |
| C            | 02-29-2016 |   55.00 |
| D            | 02-29-2016 |   11.00 |
| E            | 02-29-2016 |   22.00 |
| A            | 12-31-2015 |  100.00 |
| B            | 12-31-2015 |    0.00 |
| C            | 12-31-2015 |  200.00 |
| D            | 12-31-2015 |  300.00 |
| E            | 12-31-2015 |  400.00 |
+--------------+------------+---------+

我刚刚加载了我的测试数据和前三个数据日期。