List:Spanish« Previous MessageNext Message »
From:Alvaro Cobo Date:January 10 2007 4:19am
Subject:Re: Consulta compleja. Tabulacion cruzada
View as plain text  
Estimados amigos y mvillagomez:

Disculpen el despiste. La última pregunta que hice al respecto de

'
WHERE nombre=padre.nombre

y

FROM tabla_enlaces padre
'

Después de revisar un poco más detalladamente me di cuenta de que
"padre" solamente se refiere a un alias de la tabla en la consulta
principal.

Muchas gracias a la lista y especialmente a mvillagomez.

Saludos,

Alvaro

mvillagomez@stripped escribió:
> Tu consulta no es así de simple, aunque va por la vía correcta.
> El siguiente query esta para postgres así que solo debes implementarlo
> para MySQL.
> Te lo pongo aquí si tienes dudas.
> El Case que uso es el equivalente a tu IF.
> Este me da este resultado
> 
>
> █████████Juan
>   
> Maria   Antonio José    Maribel
>  Antonio  0       0       0       0       1
>  Juan     0       1       2       2       0
>  Maria    0       0       0       2       0
> 
> 
> SELECT nombre,
>  (
>   SELECT (CASE enlace WHEN 'Juan' THEN fuerza ELSE 0 END)::integer AS Juan
> FROM tabla_enlaces WHERE nombre=padre.nombre AND (CASE enlace WHEN
> 'Juan' THEN fuerza ELSE 0 END)::integer<>0
>  )AS Juan,
> 
>  (
>   SELECT (CASE enlace WHEN 'Maria' THEN fuerza ELSE 0 END)::integer AS
> Maria FROM tabla_enlaces WHERE nombre=padre.nombre AND (CASE enlace WHEN
> 'Maria' THEN fuerza ELSE 0 END)::integer<>0
>  )AS Maria,
> 
>  (
>   SELECT (CASE enlace WHEN 'Antonio' THEN fuerza ELSE 0 END)::integer AS
> Antonio FROM tabla_enlaces WHERE nombre=padre.nombre AND (CASE enlace
> WHEN 'Antonio' THEN fuerza ELSE 0 END)::integer<>0
>  )AS Antonio,
> 
>  (
>   SELECT (CASE enlace WHEN 'Jose' THEN fuerza ELSE 0 END)::integer AS Jose
> FROM tabla_enlaces WHERE nombre=padre.nombre AND (CASE enlace WHEN
> 'Jose' THEN fuerza ELSE 0 END)::integer<>0
>  )AS Jose,
> 
>  (
>   SELECT (CASE enlace WHEN 'Maribel' THEN fuerza ELSE 0 END)::integer AS
> Maribel FROM tabla_enlaces WHERE nombre=padre.nombre AND (CASE enlace
> WHEN 'Maribel' THEN fuerza ELSE 0 END)::integer<>0
>  )AS Maribel
> 
> FROM tabla_enlaces padre GROUP BY nombre ORDER BY nombre
> 
> 
> 
>> Ahi les mando un dump para que generen la tabla.
>>
>> Saludos,
>>
>> Alvaro
>>
>> CREATE TABLE `tabla_enlaces` (
>>   `nombre` varchar(250) NOT NULL,
>>   `enlace` varchar(250) NOT NULL,
>>   `fuerza` int(11) NOT NULL
>> ) ENGINE=InnoDB DEFAULT CHARSET=latin1;
>>
>> --
>> -- Volcar la base de datos para la tabla `tabla_enlaces`
>> --
>>
>> INSERT INTO `tabla_enlaces` VALUES ('Juan', 'Maria', 1);
>> INSERT INTO `tabla_enlaces` VALUES ('Maria', 'Jose', 2);
>> INSERT INTO `tabla_enlaces` VALUES ('Juan', 'Jose', 2);
>> INSERT INTO `tabla_enlaces` VALUES ('Antonio', 'Maribel', 1);
>> INSERT INTO `tabla_enlaces` VALUES ('Juan', 'Antonio', 2);
>>
>>
>>
>> On 1/9/07, Alvaro Cobo <coboalvaro@stripped> wrote:
>>> Hola chicos y chicas:
>>>
>>> Me estoy rompiendo la cabeza con una consulta de tabulación cruzada
> un
>>> poco compleja. Ahi les va el cuento. Tengo la siguiente tabla:
>>>
>>> +---------+---------+--------+
>>> | nombre  | enlace  | fuerza |
>>> +---------+---------+--------+
>>> | Juan    | Maria   |      1 |
>>> | Maria   | Jose    |      2 |
>>> | Juan    | Jose    |      2 |
>>> | Antonio | Maribel |      1 |
>>> | Juan    | Antonio |      2 |
>>> +---------+---------+--------+
>>>
>>> y necesito obtener una tabla mas o menos así:
>>>
>>>         Juan    Maria   Antonio José    Maribel
>>> Juan    0       1       2       2       0
>>> Maria   0       0       0       2       0
>>> Antonio 0       0       0       0       1
>>>
>>> La idea es que he entrevistado a los que están en la primera columna
>>> (nombre) y ellos me han contado que conocen a las personas de la segunda
>>> columna (enlace), y han calificado la calidad o fuerza de la relación
>>> (fuerza). Así Juan conoce a María (1), Antonio (2) y
> José (2), y María
>>> solamente dice conocer a José (con calificación de 2).
>>>
>>> He hecho la siguiente consulta:
>>>
>>> SELECT nombre,
>>>
>>> if(enlace='Juan', fuerza, NULL) AS Juan,
>>> if(enlace='Maria', fuerza, NULL) AS Maria,
>>> if(enlace='Antonio', fuerza, NULL) AS Antonio,
>>> if(enlace='Jose', fuerza, NULL) AS Jose,
>>> if(enlace='Maribel', fuerza, NULL) AS Maribel
>>>
>>> FROM tabla_enlaces
>>> GROUP BY nombre;
>>>
>>> Pero me da el siguiente resultado:
>>>
>>> +---------+------+-------+---------+------+---------+
>>> | nombre  | Juan | Maria | Antonio | Jose | Maribel |
>>> +---------+------+-------+---------+------+---------+
>>> | Antonio | NULL |  NULL |    NULL | NULL |       1 |
>>> | Juan    | NULL |     1 |    NULL | NULL |    NULL | <--
>>> | Maria   | NULL |  NULL |    NULL |    2 |    NULL |
>>> +---------+------+-------+---------+------+---------+
>>>
>>> Es decir, resulta que Juan solamente conoce a María, pero en la base
> de
>>> datos, Juan conoce a María, José y Antonio.
>>>
>>> Alguien sabe como puedo hacer para obtener la tabulación que
> necesito.
>>>
>>> Saludos y agradecimientos,
>>>
>>> Alvaro
>>>
>>>
>>>
>>
>> ------------------------------------------------------------------------
>>
>>
>> SELECT nombre, 
>>  (
>>   SELECT (CASE enlace WHEN 'Juan' THEN fuerza ELSE 0 END)::integer AS Juan FROM
> tabla_enlaces WHERE nombre=padre.nombre AND (CASE enlace WHEN 'Juan' THEN fuerza ELSE 0
> END)::integer<>0
>>  )AS Juan,
>>
>>  (
>>   SELECT (CASE enlace WHEN 'Maria' THEN fuerza ELSE 0 END)::integer AS Maria FROM
> tabla_enlaces WHERE nombre=padre.nombre AND (CASE enlace WHEN 'Maria' THEN fuerza ELSE 0
> END)::integer<>0
>>  )AS Maria,
>>
>>  (
>>   SELECT (CASE enlace WHEN 'Antonio' THEN fuerza ELSE 0 END)::integer AS Antonio
> FROM tabla_enlaces WHERE nombre=padre.nombre AND (CASE enlace WHEN 'Antonio' THEN fuerza
> ELSE 0 END)::integer<>0
>>  )AS Antonio,
>>
>>  (
>>   SELECT (CASE enlace WHEN 'Jose' THEN fuerza ELSE 0 END)::integer AS Jose FROM
> tabla_enlaces WHERE nombre=padre.nombre AND (CASE enlace WHEN 'Jose' THEN fuerza ELSE 0
> END)::integer<>0
>>  )AS Jose,
>>
>>  (
>>   SELECT (CASE enlace WHEN 'Maribel' THEN fuerza ELSE 0 END)::integer AS Maribel
> FROM tabla_enlaces WHERE nombre=padre.nombre AND (CASE enlace WHEN 'Maribel' THEN fuerza
> ELSE 0 END)::integer<>0
>>  )AS Maribel
>>
>> FROM tabla_enlaces padre GROUP BY nombre ORDER BY nombre


-- 
Teléfono: +5932 2257465
Celular: +5939 6090118 (Alegro)
Celular: +5939 9526001 (Porta)
Correo electrónico: coboalvaro@stripped
Correo Alternativo: cobo_alvaro@stripped
Skype: cobo_alvaro
MSN Messenger: cobo_alvaro@stripped
Thread
Consulta compleja. Tabulacion cruzadaAlvaro Cobo9 Jan
  • Re: Consulta compleja. Tabulacion cruzadaAlvaro Cobo9 Jan
    • Re: Consulta compleja. Tabulacion cruzadamvillagomez10 Jan
      • Re: Consulta compleja. Tabulacion cruzadaAlvaro Cobo10 Jan
      • Re: Consulta compleja. Tabulacion cruzadaAlvaro Cobo10 Jan