У меня проблемы с созданием таблицы PIVOT в MySQL. У меня есть следующая таблица. (Это уменьшенная демонстрационная таблица. Реальная имеет 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');
Выходными данными должна быть таблица, в которой каждый STOCKCODE (например, ANDR.VI) из этих 8 должен быть столбцом с одним выбираемым значением измерения (например, LScore2), сгруппированным по tradedate (= строка).
Я нашел это Exmapl в MYSQL , но я не понимаю его полностью. Более того, я сделал это:
SELECT
tradedate,
GROUP_CONCAT(stock_short) as STOCKCODE
FROM
levermann
GROUP BY
Tradedate;
Но здесь биржевые коды находятся в одной ячейке, а не в заголовке.
Вот изображение примера желаемого результата. Общее количество столбцов составляет около 4000 (максимальное количество столбцов в таблице не превышает 4096). И сделки (= строки) составляют около 350 дней / лет в течение 2 лет в общей сложности.
Понятно, что столбцы должны создаваться динамически и не могут быть жестко закодированы операторами 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