Foros del Web » Programando para Internet » PHP »

dibujar una tabla

Estas en el tema de dibujar una tabla en el foro de PHP en Foros del Web. mira mi tabla es select * from respuestas pregunta | respuesta | zona como estas | bien |arturo edad | 18 |arturo educacion | univercidad ...
  #1 (permalink)  
Antiguo 19/08/2014, 11:16
 
Fecha de Ingreso: enero-2013
Ubicación: cusco
Mensajes: 13
Antigüedad: 11 años, 3 meses
Puntos: 0
Información dibujar una tabla

mira mi tabla es
select * from respuestas

pregunta | respuesta | zona

como estas | bien |arturo
edad | 18 |arturo
educacion | univercidad |arturo
como estas | bien |juan
edad | 18 |juan
educacion | univercidad |juan
como estas | mal |maria
edad | 17 |maria
educacion | cole |maria



ok pero quiero ordenarlo en mi tabla en php de este modo

pregunta | arturo | juan | maria
como estas | bien | bien | mal
edad | 18 | 18 | 17
educacion | univercidad |univercidad | cole


por favor
  #2 (permalink)  
Antiguo 19/08/2014, 20:39
 
Fecha de Ingreso: octubre-2010
Ubicación: España
Mensajes: 1.007
Antigüedad: 13 años, 6 meses
Puntos: 123
Respuesta: dibujar una tabla

Creo que nadie a entendido lo que quieres.

Intenta replantear el problema de una forma mas clara. Gracias.
  #3 (permalink)  
Antiguo 19/08/2014, 23:49
Avatar de NSD
NSD
Colaborador
 
Fecha de Ingreso: mayo-2012
Ubicación: Somewhere
Mensajes: 1.332
Antigüedad: 11 años, 11 meses
Puntos: 320
Respuesta: dibujar una tabla

Lo que quieres es rotar una tabla.

La herramienta que estas buscando se llama Pivote, mas concretamente, un Pivote dinamico.

Por desgracia para ti, muy pocos motores soportan pivotes dinamicos y mysql no es uno de ellos.
Lo que puedes hacer, es simular este comportamiento construyendo el pivote dinamicamente (suena parecido, pero no es lo mismo que un pivote dinamico).

Para el caso particular de tu ejemplo, puedes ver una demo en: http://sqlfiddle.com/#!2/f18ffb/17 donde esta el codigo de la consulta que te devuelve el resultado esperado.

Los pivotes no son un tema para tratarse al inicio de la curva de aprendizaje, desconozco tu nivel de conocimiento de bases de datos, pero no es un tema para tomarse a la ligera y que requiere de cierta practica para comprender su funcionamiento.

Por otro lado, en el ejemplo que te pongo no se hace uso de pivotes, solo se los simula.

Como complemento, puede que encuentres interesante este articulo: http://buysql.com/mysql/14-how-to-au...ot-tables.html

Y este tema de stackoverflow en el cual me he basado para construir la query del ejemplo.

Saludos.

PD: Si sientes curiosidad por los pivotes y su funcionamiento, puedes ver ejemplos de funcionamiento en motores que si lo soportan, por ejemplo:

SQL Server:
Pivote
Pivote Dinamico

Oracle:
Pivote
Implementacion de pivote dinamico

Otros motores que carecen de esta caracteristica, tienen formas de simularlo diferentes a mysql por ejemplo:

Firebird:
https://firebird21.wordpress.com/tag/pivot-table/

Otros nombres para buscar la caracteristica solicitada son: pivot table - tabla multidimensional - cross-table
__________________
Maratón de desafíos PHP Junio - Agosto 2015 en FDW | Reglamento - Desafios
  #4 (permalink)  
Antiguo 20/08/2014, 11:05
 
Fecha de Ingreso: enero-2013
Ubicación: cusco
Mensajes: 13
Antigüedad: 11 años, 3 meses
Puntos: 0
Respuesta: dibujar una tabla

NSD sos un maestro........ gracias .....me hace una gran ayuda pero una pregunta el ejemplo que me diste de simular el pivot dinamico : da...

SELECT pregunta, (SELECT tmp.respuesta FROM test tmp WHERE tmp.zona = 'arturo' AND tmp.pregunta = main.pregunta) arturo,
(SELECT tmp.respuesta FROM test tmp WHERE tmp.zona = 'juan' AND tmp.pregunta = main.pregunta) juan,
(SELECT tmp.respuesta FROM test tmp WHERE tmp.zona = 'maria' AND tmp.pregunta = main.pregunta) MARIA
FROM test main GROUP BY pregunta;

pero al ahcer consula ami tabla se traba en 8 zonas pero son mas 20 zonas :

SELECT pregunta, (SELECT tmp.respuesta FROM test tmp WHERE tmp.zona = 'CORMALLANZACORMA' AND tmp.pregunta = main.pregunta) CORMALLANZACORMA,
(SELECT tmp.respuesta FROM test tmp WHERE tmp.zona = 'MANZACORMAACOPUNCU' AND tmp.pregunta = main.pregunta) MANZACORMAACOPUNCU,
(SELECT tmp.respuesta FROM test tmp WHERE tmp.zona = 'ACOSSIMPPY' AND tmp.pregunta = main.pregunta) ACOSSIMPPY,
(SELECT tmp.respuesta FROM test tmp WHERE tmp.zona = 'CORMACHALANIA' AND tmp.pregunta = main.pregunta) CORMACHALANIA,
(SELECT tmp.respuesta FROM test tmp WHERE tmp.zona = 'HUAYQUIPERCCA' AND tmp.pregunta = main.pregunta) HUAYQUIPERCCA,
(SELECT tmp.respuesta FROM test tmp WHERE tmp.zona = 'HUAYQUILLAPAYPAMPA' AND tmp.pregunta = main.pregunta) HUAYQUILLAPAYPAMPA,
(SELECT tmp.respuesta FROM test tmp WHERE tmp.zona = 'HUAYQUIHUAYQUI' AND tmp.pregunta = main.pregunta) HUAYQUIHUAYQUI,
(SELECT tmp.respuesta FROM test tmp WHERE tmp.zona = 'HUAYQUICAMPI' AND tmp.pregunta = main.pregunta) HUAYQUICAMPI,
(SELECT tmp.respuesta FROM test tmp WHERE tmp.zona = 'CORMALLANZACOR FROM test main GROUP BY pregunta;

eso es mira es un trabajo pa la u me diron tablas :
no soy bueno pa la mysql pero en sql aprendi cursores hice esto

DELIMITER $$
USE `bd_sias`$$
DROP PROCEDURE IF EXISTS `tatata`$$
CREATE DEFINER=`root`@`localhost` PROCEDURE `tatata`()
BEGIN
DECLARE intervencion INT;
DECLARE cont INT DEFAULT 0;
DECLARE aidseccion VARCHAR(7);
DECLARE aidsubseccion INT;
DECLARE aiditem INT;
DECLARE atitulo VARCHAR(255);
DECLARE anivel INT;
DECLARE anombre VARCHAR(255);
DECLARE avalor VARCHAR(255);
DECLARE arespuesta VARCHAR(255);
DECLARE flag2 INT DEFAULT 0;
DECLARE flag INT DEFAULT 0;
DECLARE Cursorcod CURSOR FOR SELECT idintervencion FROM intervencion WHERE idPeriodo= 2014 AND iddistrito=03 AND idprovincia=02 AND idRegion=08;
DECLARE CONTINUE HANDLER FOR NOT FOUND SET flag = 1;
SET flag = 0;
OPEN Cursorcod;
get_inter: LOOP
FETCH Cursorcod INTO intervencion;
IF flag = 1 THEN
LEAVE get_inter;
END IF;
SET cont = cont +1;
SET @variable1 = (SELECT CONCAT(C.NOMBRE ,S.NOMBRE)FROM sector S JOIN intervencion I USING ( idsector,idcomunidad,iddistrito,idprovincia,idregi on)JOIN comunidad C USING (idcomunidad,iddistrito,idprovincia,idregion) WHERE I.idintervencion=intervencion LIMIT 1);


-- INSERT INTO cara VALUES (@variable1,@variable1,@variable1);

BLOCK2: BEGIN
DECLARE Cursordatos CURSOR FOR SELECT I.idSeccion,I.idSubSeccion,I.idItem,I.titulo,I.niv el,TD.nombre, ES.valor FROM evaluacionsaneamiento ES JOIN item I USING(idSeccion,idSubSeccion,idItem)JOIN tipodato TD USING(idTipoDato) WHERE I.idSeccion='III' AND I.habilitado AND I.idSubSeccion="1" AND ES.idintervencion=intervencion ORDER BY I.orden;
DECLARE CONTINUE HANDLER FOR NOT FOUND SET flag2 = 1;
SET flag2 = 0;
OPEN Cursordatos;

get_data: LOOP
FETCH Cursordatos INTO aidseccion,aidsubseccion,aiditem,atitulo,anivel,an ombre,avalor;
IF flag2 = 1 THEN
LEAVE get_data;
END IF;
IF anombre= "Booleano" THEN SET arespuesta = (SELECT etiqueta FROM alternativasaneamiento WHERE iditem =aiditem AND idSubSeccion=aidsubseccion AND valor = avalor AND idSeccion=aidseccion ) ;
END IF;
IF anombre= "Numero" THEN SET arespuesta =avalor;
END IF;
IF anombre= "Componente" THEN SET arespuesta =avalor;
END IF;
IF anombre= "Fecha" THEN SET arespuesta =avalor;
END IF;
IF anombre= "Multiple" THEN SET arespuesta = (SELECT etiqueta FROM alternativasaneamiento WHERE iditem =aiditem AND idSubSeccion=aidsubseccion AND valor = avalor AND idSeccion=aidseccion ) ;
END IF;

IF avalor IS NULL THEN SET arespuesta ='---';
END IF;
INSERT INTO test VALUES (atitulo,arespuesta,@variable1);

END LOOP get_data;
CLOSE Cursordatos;
END BLOCK2;


END LOOP get_inter;
CLOSE Cursorcod;

END



como ves en "idintervencion" saco mas o menos el id encuestas con este ide hago busqueda de las respuestas de esa encuestas transformarlas en respuestas que puedan entender usuarios
por favor Maestrito una gauchadita ......... te envio el scrip de la tabla [URL="https://onedrive.live.com/?cid=46D0F38DACC13C05&id=46D0F38DACC13C05!219"]https://onedrive.live.com/?cid=46D0F38DACC13C05&id=46D0F38DACC13C05!219[/URL]que sale gracias de antemano Maestro

Última edición por orteloco; 20/08/2014 a las 11:17
  #5 (permalink)  
Antiguo 20/08/2014, 17:39
 
Fecha de Ingreso: enero-2013
Ubicación: cusco
Mensajes: 13
Antigüedad: 11 años, 3 meses
Puntos: 0
Respuesta: dibujar una tabla

aumente
SET @@group_concat_max_len = 200000;
y ahora sale todad la consulta completa pero vota error Error Code: 1242 Subquery
  #6 (permalink)  
Antiguo 21/08/2014, 11:32
Avatar de NSD
NSD
Colaborador
 
Fecha de Ingreso: mayo-2012
Ubicación: Somewhere
Mensajes: 1.332
Antigüedad: 11 años, 11 meses
Puntos: 320
Respuesta: dibujar una tabla

El error posiblemente sea porque hay algun nombre con alguna caracter raro, pudes probar a encerrar el nombre entre acentos graves.

Por otro lado, una tabla con 200 columnas no me parece practica, mas bien es algo dificil de manejar.

Seria mucho mas facil un select comun que traiga los resultados de una pregunta y recorrer ese select, haciendo un select por cada pregunta.

No se que efecto pretendes lograr o para que quieres usar la consulta, pero seguramente es mucho mas facil de esta forma
__________________
Maratón de desafíos PHP Junio - Agosto 2015 en FDW | Reglamento - Desafios
  #7 (permalink)  
Antiguo 21/08/2014, 14:20
 
Fecha de Ingreso: enero-2013
Ubicación: cusco
Mensajes: 13
Antigüedad: 11 años, 3 meses
Puntos: 0
Respuesta: dibujar una tabla

SELECT A.titulo,A.respuesta,B.respuesta,C.respuesta,D.res puesta,E.respuesta,F.respuesta,G.respuesta,H.respu esta,I.respuesta,J.respuesta,K.respuesta,L.respues ta,M.respuesta,N.respuesta,O.respuesta,P.respuesta ,Q.respuesta,R.respuesta FROM report1 A JOIN report2 B USING(orden,idItem,titulo)
JOIN report3 C USING(orden,idItem,titulo) JOIN report4 D USING(orden,idItem,titulo)JOIN report5 E USING(orden,idItem,titulo)
JOIN report6 F USING(orden,idItem,titulo) JOIN report7 G USING(orden,idItem,titulo)JOIN report8 H USING(orden,idItem,titulo)
JOIN report9 I USING(orden,idItem,titulo) JOIN report10 J USING(orden,idItem,titulo)JOIN report11 K USING(orden,idItem,titulo)
JOIN report12 L USING(orden,idItem,titulo) JOIN report13 M USING(orden,idItem,titulo)JOIN report14 N USING(orden,idItem,titulo)
JOIN report15 O USING(orden,idItem,titulo) JOIN report16 P USING(orden,idItem,titulo)JOIN report17 Q USING(orden,idItem,titulo)
JOIN report18 R USING(orden,idItem,titulo)
ORDER BY A.orden

ESTA ES LA UNION DE TODAS TABLAS PERO QUIERO HACERLO DINAMICAMENTE
SET a=65; ---PARA QUE COMIENSE TABLA A
WHILE v < 19 DO
SET @letra = CHAR(a);
IF( @sql IS NULL) THEN
SET @sql =@letra;
ELSE
SET @sql = CONCAT(@sql,',',@letra);
END IF;

SET a = a +1 ;
SET v = v +1 ;
END WHILE;
UNIR TDOS LAS PARTES DE ARRIBA NO SIEMPRE UNIRE 18 TABLAS SI NO 20 O 5 AYUDA PORFA

Etiquetas: dibujar, horizontal, vertical
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 06:25.