0

这是我的表的结构: 在此处输入图像描述

然后我运行一个查询

SELECT `date`,`index_name`,`results` FROM `mst_ind` WHERE `index_name` IN ('MSCI EAFE Mid NR USD', 'Alerian MLP PR USD') AND `time_period`='M1'

得到一张像

在此处输入图像描述

如何将“index_name”行转换为如下列:

日期 | MSCI EAFE Mid NR 美元 | Alerian MLP PR USD

在此处输入图像描述

换句话说,我需要每列代表一个索引和行来代表日期结果。我知道 MySQL 没有数据透视表功能。最简单的方法是什么?

我试过这段代码,但它会产生一个错误:

SELECT
  `date`,
  MAX(IF(index_name = 'Alerian MLP PR USD' AND `time_period`='M1', results, NULL)) AS res1,
  MAX(IF(index_name = 'MSCI EAFE Mid NR USD' AND `time_period`='M1', results, NULL)) AS res2
FROM
  `mst_ind`
GROUP BY `date

我需要在查询级别进行转换 - 而不是 PHP。请提出一个漂亮而优雅的解决方案。谢谢!

4

1 回答 1

0

尝试

SELECT date,
       MAX(CASE WHEN index_name = 'Alerian MLP PR USD' THEN results END) `Alerian MLP PR USD`,
       MAX(CASE WHEN index_name = 'MSCI EAFE Mid NR USD' THEN results END) `MSCI EAFE Mid NR USD`
  FROM mst_ind
 WHERE index_name IN ('MSCI EAFE Mid NR USD', 'Alerian MLP PR USD') 
   AND time_period = 'M1'
 GROUP BY date

样本输出:

| 日期 | ALERIAN MLP 公关美元 | MSCI EAFE MID NR 美元 |
|------------|--------|------------- --------|
| 1995-01-31 | -0.0167 | 0.0335 |
| 1995-02-28 | 0.0128 | 0.0409 |
| 1995-03-31 | 0.0464 | 0.0286 |
| 1995-04-28 | 0.0331 | 0.0297 |
| 1995-05-31 | 0.0069 | 0.0398 |
...

这是SQLFiddle演示

于 2013-11-05T03:51:03.077 回答