Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/three.js/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php MySQL数据透视表-将行转换为列_Php_Mysql_Pivot Table - Fatal编程技术网

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 BY
date
中的
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”以外的所有内容