【发布时间】:2018-09-20 12:35:03
【问题描述】:
我正在尝试旋转一个这样创建的 mysql 表
'CREATE TABLE `fundreturns` (
`Timestamp` datetime NOT NULL,
`FundName` varchar(255) NOT NULL,
`MonthYear` datetime NOT NULL,
`Returns` decimal(9,7) DEFAULT NULL,
PRIMARY KEY (`FundName`,`MonthYear`),
CONSTRAINT `FundName` FOREIGN KEY (`FundName`) REFERENCES `fundnames` (`fund_name`))
这样结果将是一个看起来像的表格
Date Company 1 Company 2 ...Company 200
-------------------------------------------------
09/18 {Returns }
07/18
并非每家公司每个月都有回报,而且是单个百分比数字,不需要在整个月内累加。我一直在寻找使用 mysql 或 php 的解决方案,我遇到过有关动态 sql 语句的答案并尝试使用
SET @@group_concat_max_len = 32000;
SET @sql_dynamic = (
SELECT
GROUP_CONCAT( DISTINCT
CONCAT(
'IF(fundname = '''
, fundname
, ''', returns, NULL) AS '
, fundname
)
)
FROM fundreturns
);
SET @sql = CONCAT('SELECT monthyear, ',
@sql_dynamic, '
FROM fundreturns
GROUP BY monthyear'
);
PREPARE stmt FROM @sql;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
这给了我一个错误
Error Code: 1064. You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '(ACL) Alternative Fund,IF(fundname = 'ABCA Reversion', fundreturns, NULL) AS ABC' at line 1
我做错了什么?有没有更好的方法来做到这一点?
【问题讨论】:
-
我在你的表中看不到 ACL
-
你提到了 PHP,所以我无法理解你为什么要尝试在 MySQL 中解决这个问题。
-
我愿意使用任何可行的方法,我也会使用 PHP。 ACL 是表中的公司名称。
-
所以它缺少引号。但是 PHP 肯定会提供更好的解决方案。
-
添加逗号后,大部分值都丢失了,每个日期似乎只有一个值。我见过的PHP方法似乎都需要这个查询
标签: mysql pivot-table