我在MySQL中制作PIVOT表格遇到了问题。我有以下表格。(这只是一个缩小的演示表格。真实的表格有4000个股票,例如10个交易日期和20个测量值)
CREATE TABLE `levermann` (
`RecNum` bigint(20) NOT NULL AUTO_INCREMENT,
`Tradedate` date DEFAULT NULL,
`Stock_Short` varchar(50) DEFAULT NULL,
`Country` varchar(2) DEFAULT NULL,
`LScore2` int(11) DEFAULT NULL,
`MarketCAPUSD` bigint(20) DEFAULT NULL,
PRIMARY KEY (`RecNum`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;
-- ----------------------------
-- Records of levermann
-- ----------------------------
INSERT INTO `levermann` VALUES ('8099', '2018-05-23', 'ANDR.VI', 'VI', '-9', '5109518494');
INSERT INTO `levermann` VALUES ('8100', '2018-05-23', 'BWO.VI', 'VI', '-7', '4241189324');
INSERT INTO `levermann` VALUES ('8101', '2018-05-23', 'CAI.VI', 'VI', '-7', '3222135865');
INSERT INTO `levermann` VALUES ('8102', '2018-05-09', 'CWI.VI', 'VI', '-8', null);
INSERT INTO `levermann` VALUES ('8103', '2018-05-23', 'EBS.VI', 'VI', '-7', '18317742129');
INSERT INTO `levermann` VALUES ('8104', '2018-05-23', 'FLU.VI', 'VI', '-8', '3176359049');
INSERT INTO `levermann` VALUES ('8105', '2018-05-23', 'IIA.VI', 'VI', '-8', '2767477473');
INSERT INTO `levermann` VALUES ('8106', '2018-05-23', 'LNZ.VI', 'VI', '-9', '3027507195');
输出应该是一个表格,其中这8个STOCKCODE(例如ANDR.VI)中的每一个都应该是一列,具有可选择的测量值(例如LScore2),按交易日期(=行)分组。
我找到了这个MYSQL中的示例,但我并不完全理解它。另外我已经做了以下工作:
SELECT
tradedate,
GROUP_CONCAT(stock_short) as STOCKCODE
FROM
levermann
GROUP BY
Tradedate;
但是这里的股票代码在一个单元格中而不是标题中。 下面是所需输出示例的图像。总列数约为4000(表中的最大列数不超过4096)。交易日期(=行)为2年共约350天/年。
显然,应该通过动态方式创建列,而不能通过AS语句硬编码。
有没有解决这个难题的方法? 非常感谢。
更新: 我想到了一个类似于动态运行的语句..
SET @sql = NULL;
SELECT GROUP_CONCAT(concat(LScore2,' AS `LScore_',Stock_Short,'`')) into
@sql from levermann;
SET @sql = CONCAT('SELECT tradedate, ', @sql, '
FROM levermann
GROUP BY tradedate');
PREPARE stmt FROM @sql;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
但是我不知道如何创建这个字符串:
LScore AS LScore_ANDR.VI, LScore AS LScore_BWO.VI, ...
我很怀疑它是否可以在MySQL中完成。 当然,我也可以制作一个php脚本。但我想学习如何在MySQL中完成。
更新2:我想我可以做到。我不太确定它是否正确,但它是动态创建的。在MySQL中。
SET SESSION group_concat_max_len = @@max_allowed_packet;
,GROUP_CONCAT manual说:“结果被截断为group_concat_max_len系统变量给定的最大长度,其默认值为1024。”通常情况下,在使用GROUP_CONCAT
时配置group_concat_max_len
设置。" - Raymond NijlandMAX(CASE Stock_Short WHEN <value> THEN LScore2 END) AS <alias>,
我不确定你在这里做什么或者你在谈论什么。 - Raymond Nijland