Ver Mensaje Individual
  #5 (permalink)  
Antiguo 02/12/2014, 20:08
Avatar de hdionicio
hdionicio
 
Fecha de Ingreso: enero-2012
Ubicación: Huánuco, Perú
Mensajes: 10
Antigüedad: 12 años, 4 meses
Puntos: 0
De acuerdo Respuesta: Referencia cruzada de la suma de 2 tablas distinta en MySQL

Logré construir el pivot dinamico, anexo los codigos por si les sirva a alguien.

Código MySQL:
Ver original
  1. DROP TABLE IF EXISTS `horas_paradas`;
  2. CREATE TABLE `horas_paradas` (
  3.   `equ_codigo` varchar(10) NOT NULL,
  4.   `tur_codigo` varchar(2) NOT NULL,
  5.   `con_fecha` date NOT NULL,
  6.   `par_codigo` varchar(5) NOT NULL,
  7.   `pro_codigo` varchar(5) NOT NULL,
  8.   `hor_par_hora` double DEFAULT NULL,
  9.   `hor_par_indicador` varchar(3) DEFAULT NULL,
  10.   PRIMARY KEY (`equ_codigo`,`tur_codigo`,`con_fecha`,`par_codigo`,`pro_codigo`),
  11.   KEY `fk_horas_paradas_paralizacion1` (`par_codigo`)
-----------------------------------------------------------------------
Código MySQL:
Ver original
  1. DROP TABLE IF EXISTS `horas_trabajadas`;
  2. CREATE TABLE `horas_trabajadas` (
  3.   `equ_codigo` varchar(10) NOT NULL,
  4.   `tur_codigo` varchar(2) NOT NULL,
  5.   `con_fecha` date NOT NULL,
  6.   `ua_codigo` varchar(10) NOT NULL,
  7.   `pro_codigo` varchar(5) NOT NULL,
  8.   `hor_tra_horas` double NOT NULL,
  9.   `hor_tra_valor` double DEFAULT NULL,
  10.   `hor_tra_produccion` double DEFAULT NULL,
  11.   PRIMARY KEY (`equ_codigo`,`tur_codigo`,`con_fecha`,`ua_codigo`,`pro_codigo`),
  12.   KEY `fk_horas_trabajadas_ua1` (`ua_codigo`)
-----------------------------------------------------------------------
Uní las 2 tablas mediante este código.

Código MySQL:
Ver original
  1.         e.equ_codigo AS CodigoEQ,
  2. e.equ_descripcion ,'  ',
  3. m.mar_descripcion ,'  ',
  4. e.equ_modelo ,'  ',
  5. empresa.emp_razonsocial) AS DescripcionEQ,
  6. e.equ_modelo AS ModeloEQ,      
  7. ht.tur_codigo AS Turno,
  8.         ht.con_fecha AS Fecha,
  9.         e.pro_codigo AS CodProyecto,
  10.         ht.hor_tra_horas AS Horas,
  11. m.mar_descripcion AS NombreMarca,
  12. empresa.emp_razonsocial AS NombreEmpresa
  13.  
  14. horas_trabajadas ht
  15. INNER JOIN equipamento e
  16. ON ht.equ_codigo = e.equ_codigo
  17. INNER JOIN marcas m
  18. ON e.mar_codigo = m.mar_codigo
  19. INNER JOIN empresa
  20. ON e.emp_codigo = empresa.emp_codigo
  21.  
  22.  
  23.     e.equ_codigo as CodigoEQ,
  24. e.equ_descripcion ,'  ',
  25. m.mar_descripcion ,'  ',
  26. e.equ_modelo ,'  ',
  27. empresa.emp_razonsocial) AS DescripcionEQ,
  28. e.equ_modelo AS ModeloEQ,
  29.     hp.tur_codigo as Turno,
  30.     hp.con_fecha as Fecha,
  31.     e.pro_codigo as CodProyecto,
  32.     hp.hor_par_hora as Horas,
  33. m.mar_descripcion AS NombreMarca,
  34. empresa.emp_razonsocial AS NombreEmpresa
  35.  
  36. FROM horas_paradas hp
  37. INNER JOIN equipamento e
  38. ON hp.equ_codigo = e.equ_codigo
  39. INNER JOIN marcas m
  40. ON e.mar_codigo = m.mar_codigo
  41. INNER JOIN empresa
  42. ON e.emp_codigo = empresa.emp_codigo
  43.  
  44. ORDER BY CodigoEQ
----------------------------------------------------
Luego a partir de la vista construí el Procedimiento almacenado para el pivot dinamico.

Código MySQL:
Ver original
  1. DECLARE finish INT DEFAULT 0;
  2. DECLARE cdate date;
  3. DECLARE str VARCHAR(10000) DEFAULT "select CodigoEQ,DescripcionEQ,Turno,";
  4. DECLARE strfilt VARCHAR(100) DEFAULT CONCAT("FROM res_horas_consolidado WHERE Turno = '",turn,"' GROUP BY CodigoEQ");
  5. DECLARE curs cursor for select Fecha
  6. FROM res_horas_consolidado
  7. WHERE Fecha BETWEEN sdate AND edate GROUP BY Fecha;
  8. DECLARE continue handler for not found SET finish = 1;
  9. OPEN curs;
  10. my_loop:LOOP
  11. FETCH curs INTO cdate;
  12. IF finish = 1 THEN
  13. LEAVE my_loop;
  14. SET str = concat(str, "sum(case when Fecha = '",cdate,"' then Horas else null end) as `",cdate,"`,");
  15. END LOOP;
  16. CLOSE curs;
  17. SET str = substr(str,1,char_length(str)-1);
  18. SET @str = concat(str, strfilt);
  19.  
  20. PREPARE stmt FROM @str;
  21. EXECUTE stmt;
  22. DEALLOCATE PREPARE stmt;

Parametros procedure: IN sdate date, IN edate date, IN turn VARCHAR(10)

Suerte.