tengo una tabla con un campo llave secundaria 'cve_t_indicador', el cual se puede duplicar n...veces;
https://drive.google.com/file/d/1bOStfXj0sQgw8wp136BwA2qMrJ-lefoL/view?usp=sharing
entonces cada ves que se repita esa llave secundaria, se agregarían 4 columnas a lo largo del reporte:
https://drive.google.com/file/d/1B8JI_ciYt9X3FLZ8JL9hPU5xMA-Id_G7/view?usp=sharing
teniendo en cuenta que los campos entre la tabla y el reporte serian estos:
NOM_V1=nombre_variable,DESC_V1=descripcion_variable,UM_V1=unidad_medida, FUENTE_V1=fuente
Por ejemplo: si la llave ('cve_t_indicador' = '1') se repitiera 4 veces en la tabla, entonces en el reporte arrojaria un solo registro o fila, y 16 columnas a lo largo del reporte marcado con el numero consecutivo de la variable:
NOM_V1, DESC_V1, UM_V1, FUENTE_V1
NOM_V2, DESC_V2, UM_V2, FUENTE_V2
NOM_V3, DESC_V3, UM_V3, FUENTE_V3
NOM_V4, DESC_V4, UM_V4, FUENTE_V4
para que al final se genere el reporte con 1 solo registro llave primaria y una secundaria y los duplicados como columnas a lo largo de la sabana del reporte...al final arrojaría 6 registros la consulta descartando los registros duplicados de filas a columnas.
aqui esta el codigo que llevo:
https://drive.google.com/file/d/1ooftNquqzTZvWqCGhCG-kKBSnNrDeIN9/view?usp=sharing
https://drive.google.com/file/d/1SzmC4_-Z8nD3q-JNdf415ah_pCN5tQgE/view?usp=sharing
Código
Saludos cordiales...
DELIMITER $$ CREATE PROCEDURE sp_AlterTable() BEGIN IF NOT EXISTS (SELECT * FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_SCHEMA = 'dbName' AND TABLE_NAME = 'email_subscription' AND COLUMN_NAME = 'subscribe_all') THEN ALTER TABLE email_subscription ADD COLUMN subscribe_all TINYINT(1) DEFAULT 1, ADD COLUMN subscribe_category VARCHAR(512) DEFAULT NULL; END IF; END $$ DELIMITER ; DELIMITER $$ DROP PROCEDURE IF EXISTS sp_AlterTable; CREATE OR REPLACE PROCEDURE sp_AlterTable() BEGIN DECLARE done INT DEFAULT FALSE; DECLARE cve_t_indicador_variable INT; DECLARE _cve_t_indicador INT; DECLARE _nombre_variable VARCHAR(200); DECLARE _descripcion_variable VARCHAR(500); DECLARE _unidad_medida VARCHAR(100); DECLARE _fuente VARCHAR(500); DECLARE _i INT; DROP TABLE IF EXISTS tempReporte; CREATE TEMPORARY TABLE IF NOT EXISTS tempReporte SELECT cve_t_indicador_variable, cve_t_indicador, nombre_variable, descripcion_variable, unidad_medida, fuente FROM t_indicador_variables -- WHERE cve_t_indicador DECLARE _variables CURSOR FOR SELECT * FROM tempReporte -- GROUP BY cve_t_indicador; DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = TRUE; SET i = 0; OPEN _variables; LOOP read_loop: LOOP FETCH _variables INTO _cve_t_indicador_variable, _cve_t_indicador, _nombre_variable, _descripcion_variable, _unidad_medida, _fuente; IF done THEN LEAVE read_loop; END IF; IF cve_t_indicador = i THEN IF NOT EXISTS (SELECT * FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_SCHEMA = 'devms031_2a_SEPTIEMBRE_2020' AND TABLE_NAME = 'tempReporte' AND COLUMN_NAME = @i) THEN ALTER TABLE t_indicador_variables ADD COLUMN NOM_V + @i VARCHAR(200), ADD COLUMN DESC_V + @i VARCHAR(500), ADD COLUMN UM_V + @i VARCHAR(100), ADD COLUMN FUENTE_V + @i VARCHAR(500); END IF; INSERT INTO tempReporte ( NOM_V, DESC_V, UM_V, FUENTE_V) (SELECT _nombre_variable, _descripcion_variable, _unidad_medida, _fuente FROM tempReporte) END IF; END LOOP; SET i = i + 1; CLOSE _variables; END $$ DELIMITER ; -- -------------------------------------------------------------------------------------------------------- CALL sp_AlterTable