agrupar resultados de tres tablas

Iniciado por vhugo_rf, 5 Febrero 2014, 16:44 PM

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

vhugo_rf

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


y necesito los datos así




me pueden ayudar por favor, muchas gracias

1mpuls0

Utiliza subconsultas.

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

Nakatsukasa Itero

en primera te sale así porque solo pides que te salgan 3 columnas 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 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..."
Kanashimi no Itero

vhugo_rf

Cita de: Darhius 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.


Hola, pongo la estructura de mis tablas



--
-- 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