convertir registros duplicados a columnas en una sabana de reporte en mariadb

Iniciado por Ron Bacardi, 27 Noviembre 2020, 02:34 AM

0 Miembros y 1 Visitante están viendo este tema.

Ron Bacardi

deseo encontrar solución a este desafío:

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 (sql) [Seleccionar]
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

Saludos cordiales...