PIVOT:将行转换为列 - MYSQL

时间:2016-10-17 20:06:02

标签: mysql pivot

我正在寻找关于Mysql中PIVOT的提示或答案。

因为,实际上我需要构建一个存储过程或SELECT。 我必须将动态行转换为Mysql中两个表之间的列。

有谁知道怎么做?

感谢。

DELIMITER $
DROP PROCEDURE IF EXISTS SP_PIVOT $
CREATE PROCEDURE SP_PIVOT(
        IN unidad_documental INT(11))
BEGIN
DECLARE CADENA VARCHAR(2000);
DECLARE _ESTRUCTURA VARCHAR(250);
DECLARE _METADATO VARCHAR(250);
DECLARE _end INT DEFAULT 0;
DECLARE CANTIDAD_ESTRUCTURAS INT;
DECLARE i INT DEFAULT 0;
DECLARE _CURSOR CURSOR FOR 
SELECT 
REPLACE(e.DESCRIPCION," ",'_') AS ESTRUCTURA, 
m.VALOR 
from estructura e 
inner join metadata m on m.id_estructura = e.id_estructura 
where e.id_unidad_documental = 1 ORDER BY M.ID_DOCUMENTO ASC;
DECLARE CONTINUE HANDLER FOR NOT FOUND SET _end = 1;
SELECT COUNT(*) INTO CANTIDAD_ESTRUCTURAS FROM ESTRUCTURA WHERE ID_UNIDAD_DOCUMENTAL = 1; 
DROP TABLE IF EXISTS TBL_PIVOT_TEMPORAL;
CREATE TEMPORARY TABLE TBL_PIVOT_TEMPORAL(Campo1 INT, Campo2 VARCHAR(150), Campo3 VARCHAR(250), Campo4 INT(11), Campo5 DECIMAL(12,2));
SET @CADENA = CONCAT('INSERT INTO TBL_PIVOT_TEMPORAL (Campo1,Campo2,Campo3,Campo4,Campo5)
SELECT 
ud.ID_UNIDAD_DOCUMENTAL,
d.NOMBRE,
d.RUTA_ARCHIVO,
d.PAGINAS,
d.TAMANO
from unidad_documental ud
inner join lote l on l.id_unidad_documental = ud.id_unidad_documental
inner join documento d on d.id_lote = l.id_lote
inner join metadata m on m.id_documento = d.id_documento
where ud.id_unidad_documental = 1 ORDER BY D.ID_DOCUMENTO ASC');
PREPARE SENTENCIA FROM @CADENA;
EXECUTE SENTENCIA;
DEALLOCATE PREPARE SENTENCIA;
OPEN _CURSOR;
_BUCLE : LOOP
SET i = i+1;
FETCH _CURSOR INTO _ESTRUCTURA, _METADATO;
IF _end = 1 THEN  
LEAVE _BUCLE;
END IF;
WHILE(i < CANTIDAD_ESTRUCTURAS) DO
SET @AGREGAR_COLUMNA = CONCAT('ALTER TABLE TBL_PIVOT_TEMPORAL ADD ',_ESTRUCTURA,' VARCHAR(250)');
PREPARE SENTENCIA2 FROM @AGREGAR_COLUMNA;
EXECUTE SENTENCIA2;
DEALLOCATE PREPARE SENTENCIA2;
END WHILE;
END LOOP;
CLOSE _CURSOR;
SELECT * FROM TBL_PIVOT_TEMPORAL GROUP BY Campo2 LIMIT 100;
END
$

0 个答案:

没有答案