Php MySQL数据透视表-将行转换为列
这是我的表的结构: 然后我运行一个查询Php MySQL数据透视表-将行转换为列,php,mysql,pivot-table,Php,Mysql,Pivot Table,这是我的表的结构: 然后我运行一个查询 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”行转换为以下列: 日期|摩根士丹利资本国际EAFE中期NR美元|亚历良MLP PR美元等 换句话说,我需要每列表
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”行转换为以下列:
日期|摩根士丹利资本国际EAFE中期NR美元|亚历良MLP PR美元等
换句话说,我需要每列表示一个索引,每行表示一个日期结果。我知道MySQL没有透视表函数。最简单的方法是什么
我尝试了此代码,但它生成了一个错误:
选择
`日期`,
最大值(如果(指数名称为'Alerian MLP PR USD',时间段为'M1',结果为空))为res1,
最大值(如果(指数名称='MSCI EAFE Mid NR USD'和'time\u period'='M1',结果,NULL))为res2
从…起
`mst_工业`
按日期分组
我需要在查询级别进行转换,而不是PHP。请提出一个好的、优雅的解决方案。谢谢 试试看
选择日期,
最大值(索引名称为'Alerian MLP PR USD'然后结果结束时的情况)`Alerian MLP PR USD`,
最大值(指数名称为'MSCI EAFE Mid NR USD'然后结果结束时的情况)`MSCI EAFE Mid NR USD`
来自mst_ind
其中索引名称为('MSCI EAFE中期NR美元,'Alerian MLP PR美元')
时间周期='M1'
按日期分组
样本输出:
| DATE | ALERIAN MLP PR USD | MSCI EAFE MID NR USD |
|------------|--------------------|----------------------|
| 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 |
...
|日期| ALERIAN MLP PR USD | MSCI EAFE MID NR USD|
|------------|--------------------|----------------------|
| 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 |
...
这是演示我敢肯定我以前至少看过一次这个问题。可能是这样的:该解决方案需要多重连接,这使得大量字段的查询变得复杂。到目前为止,我发现最好的方法是:选择
date
,MAX(如果(index\u name
='Alerian MLP PR USD'和time\u period
='M1',results,NULL))作为Alerian MLP PR USD
,MAX(如果(index\u name
='NR'MSCI EAFE Mid USD'和time\u period
='M1',results,NULL))正如mst\u ind
GROUP BYdate
中的MSCI EAFE Mid NR USD
,这是一个与我在帖子中提到的非常类似的解决方案,即选择date
,MAX(如果(索引名称='Alerian MLP PR USD'和时间段
='M1',results,NULL))作为res1,MAX(如果(指数名称为“摩根士丹利资本国际EAFE中期NR USD”,时间段为“M1”,结果为空)作为来自mst\u ind
GROUP BY的res2`date@user2723490是的,非常接近。但首先,在你的问题中,你明确指出……我尝试了这段代码,但它产生了一个错误……除此之外,重要的区别是,你的查询获取所有数据,即使你只需要时间段M1
,然后处理它ile建议的查询在应用WHERE
子句中的条件处理bib的早期阶段过滤掉除“M1”以外的所有内容