Foro de elhacker.net

Programación => Bases de Datos => Mensaje iniciado por: vhugo_rf en 5 Febrero 2014, 16:44 pm



Título: agrupar resultados de tres tablas
Publicado por: vhugo_rf en 5 Febrero 2014, 16:44 pm
Hola, tengo una base de datos con tres tablas, y necesito el promedio de cada bloque, tengo la siguiente consulta, pero me pone todo como lista y lo necesito como tabla uno frente del otro, adjunto imagenes.

SELECT bl.bloque as 'bloque', ROUND(avg(rp.respuesta) , 2 ) as 'promedio', rp.relacion as 'relacion'
FROM respuestas rp
inner join bloque bl
on rp.id_bloque = bl.id_bloque
inner join pregunta pr
on rp.id_pregunta = pr.id_pregunta
where rp.id_encuesta = 1
and rp.evaluado = 2
and rp.relacion in (select id_relacion from relacion)
and pr.activa = 1
and pr.eliminada = 0
group by rp.relacion, rp.id_bloque;

La consulta anterior arroja lo siguiente
(http://delhugo.hostzi.com/prueba/img/tengo.jpg)

y necesito los datos así
(http://delhugo.hostzi.com/prueba/img/necesito.jpg)



me pueden ayudar por favor, muchas gracias


Título: Re: agrupar resultados de tres tablas
Publicado por: 1mpuls0 en 7 Febrero 2014, 20:35 pm
Utiliza subconsultas.

Coloca el diseño exacto de tus tablas y te ayudo, junto con algunos datos de ejemplo.


Título: Re: agrupar resultados de tres tablas
Publicado por: Nakatsukasa Itero en 8 Febrero 2014, 05:43 am
en primera te sale así porque solo pides que te salgan 3 columnas
Código:
bl.bloque as 'bloque', ROUND(avg(rp.respuesta) , 2 ) as 'promedio', rp.relacion as 'relacion'
para que te salgan las otras 8 columnas debes de cambiar el código a algo parecido a esto
Código:
bl.bloque as 'bloque', ROUND(avg(rp.respuesta) , 2 ) as 'promedio', rp.relacion as 'relacion' ROUND(avg(rp.respuesta) , 2 ) as 'promedio', rp.relacion as 'relacion'
recuerda que te digo que parecido más no igual este es solo un ejemplo.

la idea que me viene a la cabeza es que primero hagas una consulta para obtener solo los row (la parte de bloque) luego con una anidación en join (que ciertamente no lo uso, yo soy más abcc: altas bajas cambios consultas; pero más cimples sin taanta complicación sql) hacer la consulta que se tome el promedio y relación cuando bloque sea `bloque`, pero el problema sería en  que las columnas se toman con solo x regustros, luego las siguientes columnas a partir de los registros que no fueron tomados en cuanta hasta los siguientes, es pues como hacer una segmentación de los registros que se tienen, en cuy caso si siempre son 15 columnas puedes hacer se que cuenten de x a y, luego de (y+1) a (y+1)+incremento y así pero es en la parte de "AS prom..."


Título: Re: agrupar resultados de tres tablas
Publicado por: vhugo_rf en 14 Febrero 2014, 17:20 pm
Utiliza subconsultas.

Coloca el diseño exacto de tus tablas y te ayudo, junto con algunos datos de ejemplo.


Hola, pongo la estructura de mis tablas

Código:

--
-- Estructura de tabla para la tabla `respuestas`
--

CREATE TABLE IF NOT EXISTS `respuestas` (
  `id_respuesta` int(11) NOT NULL AUTO_INCREMENT,
  `id_encuesta` int(11) NOT NULL,
  `id_bloque` int(11) NOT NULL,
  `id_pregunta` int(11) NOT NULL,
  `evaluado` int(11) NOT NULL,
  `relacion` int(11) NOT NULL,
  PRIMARY KEY (`id_respuesta`)
) ENGINE=MyISAM  DEFAULT CHARSET=latin1 AUTO_INCREMENT=1 ;


CREATE TABLE IF NOT EXISTS `bloque` (
  `id_bloque` int(11) NOT NULL AUTO_INCREMENT,
  `bloque` varchar(50) NOT NULL,
  PRIMARY KEY (`id_bloque`)
) ENGINE=MyISAM  DEFAULT CHARSET=latin1 AUTO_INCREMENT=1;

CREATE TABLE IF NOT EXISTS `pregunta` (
  `id_pregunta` int(11) NOT NULL AUTO_INCREMENT,
  `activa` tinyint(1) NOT NULL DEFAULT '0',
  `eliminada` tinyint(1) NOT NULL DEFAULT '0',
  PRIMARY KEY (`id_pregunta`)
) ENGINE=MyISAM  DEFAULT CHARSET=latin1 AUTO_INCREMENT=1;




sigo sin poder, ya intente con subconsultas y nada, espero me puedas ayudar.  Muchas gracias