Foros del Web » Programación para mayores de 30 ;) » Bases de Datos General » Mysql »

Referencias Cruzadas

Estas en el tema de Referencias Cruzadas en el foro de Mysql en Foros del Web. hola amigos de foros del web nuevamente. En esta ocacion queria hacerles una consulta sobre trablas con referencias cruzadas, mi problema es que con una ...
  #1 (permalink)  
Antiguo 09/12/2011, 11:26
 
Fecha de Ingreso: diciembre-2008
Mensajes: 88
Antigüedad: 16 años
Puntos: 0
Pregunta Referencias Cruzadas

hola amigos de foros del web nuevamente.

En esta ocacion queria hacerles una consulta sobre trablas con referencias cruzadas, mi problema es que con una consulta genero una tabla pero en todos los campos aparece el mismo resultado y no los calcula segun la fecha, dejo el codigo:

Código:
select CT.DESC_PRODUCTO as PROD,
COUNT(CASE WHEN FECHA = (select DATE_SUB(max(FECHA),INTERVAL 6 DAY) from ces_ivr_eventos ) THEN CT.IDEN_SERVICIO ELSE 0 END) as DIA_1,
COUNT(CASE WHEN FECHA = (select DATE_SUB(max(FECHA),INTERVAL 5 DAY) from ces_ivr_eventos ) THEN (select CT2.IDEN_SERVICIO from  ces_ivr_eventos CE2 inner join ces_ivr_tipo_vel_inet CT2 on CE2.RUT = CT2.RUT_PERSONA where abrev_evento = 'internet' and CE2.FECHA = '2011-11-16') ELSE 0 END) as DIA_2,
COUNT(CASE WHEN FECHA = (select DATE_SUB(max(FECHA),INTERVAL 4 DAY) from ces_ivr_eventos ) THEN CT.IDEN_SERVICIO ELSE 0 END) as DIA_3,
COUNT(CASE WHEN FECHA = (select DATE_SUB(max(FECHA),INTERVAL 4 DAY) from ces_ivr_eventos ) THEN CT.IDEN_SERVICIO ELSE 0 END) as DIA_4,
COUNT(CASE WHEN FECHA = (select DATE_SUB(max(FECHA),INTERVAL 4 DAY) from ces_ivr_eventos ) THEN CT.IDEN_SERVICIO ELSE 0 END) as DIA_5,
COUNT(CASE WHEN FECHA = (select DATE_SUB(max(FECHA),INTERVAL 4 DAY) from ces_ivr_eventos ) THEN CT.IDEN_SERVICIO ELSE 0 END) as DIA_6,
COUNT(CASE WHEN FECHA = (select DATE_SUB(max(FECHA),INTERVAL 4 DAY) from ces_ivr_eventos ) THEN CT.IDEN_SERVICIO ELSE 0 END) as DIA_7
from ces_ivr_eventos CE inner join ces_ivr_tipo_vel_inet CT on CE.RUT = CT.RUT_PERSONA
where abrev_evento = 'internet' and
FECHA = (select DATE_SUB(max(FECHA),INTERVAL 6 DAY) from ces_ivr_eventos )
group by CT.DESC_PRODUCTO
order by 1

ESTO DEVUELVE LO SIGUIENTE:


250K WiMax 2 2 2 2 2 2 2
300 Kbps 21 21 21 21 21 21 21
300K 24 24 24 24 24 24 24
600 Kbps Megavia 2 2 2 2 2 2 2
Mega 1 5 5 5 5 5 5 5
Mega 1 WiMax 4 4 4 4 4 4 4
Mega 15 570 570 570 570 570 570 570
Mega 15 Personal 4 4 4 4 4 4 4
Mega 18 13 13 13 13 13 13 13
Mega 2 362 362 362 362 362 362 362
Mega 2 WiMax 51 51 51 51 51 51 51
Mega 40 122 122 122 122 122 122 122
Mega 40 Personal 2 2 2 2 2 2 2
Mega 6 Triple + PC 1 1 1 1 1 1 1
Mega 8 151 151 151 151 151 151 151

nose que estara mal en la consulta que siempre devuelve los resultados del 1 solo dia que es el de 15, no se si me podrian hechar una mano con esto, gracias
  #2 (permalink)  
Antiguo 09/12/2011, 11:49
Colaborador
 
Fecha de Ingreso: enero-2007
Ubicación: México
Mensajes: 2.097
Antigüedad: 17 años, 11 meses
Puntos: 447
Respuesta: Referencias Cruzadas

Hola massu_vago:

Creo que tienes un grave problema de Copiar-Pegar jejeje

para los campos dia_3 , 4, 5 y 6,7 SOLO CAMBIASTE EL ALIAS, pero la manera en que estás calculando el dato ES EXACTAMENTE EL MISMO:

Código MySQL:
Ver original
  1. COUNT(CASE WHEN FECHA = (select DATE_SUB(max(FECHA),INTERVAL 4 DAY) from ces_ivr_eventos )
  2. THEN CT.IDEN_SERVICIO ELSE 0 END) as DIA_3,
  3. COUNT(CASE WHEN FECHA = (select DATE_SUB(max(FECHA),INTERVAL 4 DAY) from ces_ivr_eventos )
  4. THEN CT.IDEN_SERVICIO ELSE 0 END) as DIA_4,
  5. COUNT(CASE WHEN FECHA = (select DATE_SUB(max(FECHA),INTERVAL 4 DAY) from ces_ivr_eventos )
  6. THEN CT.IDEN_SERVICIO ELSE 0 END) as DIA_5,
  7. COUNT(CASE WHEN FECHA = (select DATE_SUB(max(FECHA),INTERVAL 4 DAY) from ces_ivr_eventos )
  8. THEN CT.IDEN_SERVICIO ELSE 0 END) as DIA_6,
  9. COUNT(CASE WHEN FECHA = (select DATE_SUB(max(FECHA),INTERVAL 4 DAY) from ces_ivr_eventos )
  10. THEN CT.IDEN_SERVICIO ELSE 0 END) as DIA_7

Creo que es obvio el por qué está regresando el mismo dato repetido jejeje

Cambia el interval por el respectivo valor y nos dices.

Saludos
Leo
  #3 (permalink)  
Antiguo 11/12/2011, 20:25
 
Fecha de Ingreso: diciembre-2008
Mensajes: 88
Antigüedad: 16 años
Puntos: 0
Respuesta: Referencias Cruzadas

ocea es que aun que cambie el interval devuelve os mismos valores no se que en puede estar fallando el codigo :(.
  #4 (permalink)  
Antiguo 11/12/2011, 20:25
 
Fecha de Ingreso: diciembre-2008
Mensajes: 88
Antigüedad: 16 años
Puntos: 0
Respuesta: Referencias Cruzadas

Cita:
Iniciado por leonardo_josue Ver Mensaje
Hola massu_vago:

Creo que tienes un grave problema de Copiar-Pegar jejeje

para los campos dia_3 , 4, 5 y 6,7 SOLO CAMBIASTE EL ALIAS, pero la manera en que estás calculando el dato ES EXACTAMENTE EL MISMO:

Código MySQL:
Ver original
  1. COUNT(CASE WHEN FECHA = (select DATE_SUB(max(FECHA),INTERVAL 4 DAY) from ces_ivr_eventos )
  2. THEN CT.IDEN_SERVICIO ELSE 0 END) as DIA_3,
  3. COUNT(CASE WHEN FECHA = (select DATE_SUB(max(FECHA),INTERVAL 4 DAY) from ces_ivr_eventos )
  4. THEN CT.IDEN_SERVICIO ELSE 0 END) as DIA_4,
  5. COUNT(CASE WHEN FECHA = (select DATE_SUB(max(FECHA),INTERVAL 4 DAY) from ces_ivr_eventos )
  6. THEN CT.IDEN_SERVICIO ELSE 0 END) as DIA_5,
  7. COUNT(CASE WHEN FECHA = (select DATE_SUB(max(FECHA),INTERVAL 4 DAY) from ces_ivr_eventos )
  8. THEN CT.IDEN_SERVICIO ELSE 0 END) as DIA_6,
  9. COUNT(CASE WHEN FECHA = (select DATE_SUB(max(FECHA),INTERVAL 4 DAY) from ces_ivr_eventos )
  10. THEN CT.IDEN_SERVICIO ELSE 0 END) as DIA_7

Creo que es obvio el por qué está regresando el mismo dato repetido jejeje

Cambia el interval por el respectivo valor y nos dices.

Saludos
Leo
le cambie el interval pero muestra lo mismo si te fijas en las dos primeras filas del codigo estan cambiado pero me muestran los mismos datos del dia 15 por ejemplo
  #5 (permalink)  
Antiguo 11/12/2011, 21:56
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 17 años
Puntos: 2658
Respuesta: Referencias Cruzadas

El COUNT() no es funcional para lo que quieres hacer, porque en el contexto que lo usas siempre sumará datos de la misma forma, ya que en realidad para que los cuente, el CASE interior debe devolver algo. Y por "algo" me refiero a cualquier cosa que no sea un NULL... incluyendo los ceros.
O sea que te está contando hasta los ceros.

Para que veas que es cierto:
Código MySQL:
Ver original
  1. mysql> SELECT COUNT(0) cuenta;
  2. +--------+
  3. | cuenta |
  4. +--------+
  5. |      1 |
  6. +--------+
  7. 1 row in set (0.00 sec)

Por otro lado, hacer subconsultas en las columnas del SELECT es algo extremadamente ineficiente , ya que esas subconsultas se ejecutan una vez por cada registro devuelto por la consulta mayor. O sea que si esa consulta devolviese 1000 registros, cada subconsulta del SELECT se ejecutará 1000 veces...

¿Un espanto, no?

Tratemos de pulir un poco la cosa:
Código MySQL:
Ver original
  1.     CT.DESC_PRODUCTO PROD,
  2.     SUM(IF(FECHA = DATE_SUB(MAX(T1.DIA_REF), INTERVAL 6 DAY), 1, 0)) DIA_1,
  3.     SUM(IF(FECHA = DATE_SUB(MAX(T1.DIA_REF) AND FECHA = '2011-11-16', INTERVAL 5 DAY), 1, 0)) DIA_2,
  4.     SUM(IF(FECHA = DATE_SUB(MAX(T1.DIA_REF), INTERVAL 4 DAY), 1, 0)) DIA_3,
  5.     SUM(IF(FECHA = DATE_SUB(MAX(T1.DIA_REF), INTERVAL 3 DAY), 1, 0)) DIA_4,
  6.     SUM(IF(FECHA = DATE_SUB(MAX(T1.DIA_REF), INTERVAL 2 DAY), 1, 0)) DIA_5,
  7.     SUM(IF(FECHA = DATE_SUB(MAX(T1.DIA_REF), INTERVAL 1 DAY), 1, 0)) DIA_6,
  8.     SUM(IF(FECHA = T1.DIA_REF, 1, 0)) DIA_7
  9. FROM ces_ivr_eventos CE INNER JOIN ces_ivr_tipo_vel_inet CT ON CE.RUT = CT.RUT_PERSONA
  10.     JOIN (SELECT MAX(FECHA) DIA_REF FROM ces_ivr_eventos) T1
  11.     abrev_evento = 'internet' AND
  12.     FECHA BETWEEN DATE_SUB(MAX(T1.DIA_REF), INTERVAL 6 DAY) AND DIA_REF
  13. GROUP BY CT.DESC_PRODUCTO
  14. ORDER BY PROD;

No estoy muy seguro de que si es esto lo que quieres lograr, pero usando SUM() e IF() seguro que lograrás contar mejor que con ese enredo que estás haciendo ahora.

Lo que si, para poder ayudarte mejor sería bueno que nos explicases qué es lo que se supone que estás contando y qué es lo que deseas lograr. Porque la consulta que planteas es, como mínimo, confusa.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #6 (permalink)  
Antiguo 12/12/2011, 06:52
 
Fecha de Ingreso: diciembre-2008
Mensajes: 88
Antigüedad: 16 años
Puntos: 0
Pregunta Respuesta: Referencias Cruzadas

Cita:
Iniciado por gnzsoloyo Ver Mensaje
El COUNT() no es funcional para lo que quieres hacer, porque en el contexto que lo usas siempre sumará datos de la misma forma, ya que en realidad para que los cuente, el CASE interior debe devolver algo. Y por "algo" me refiero a cualquier cosa que no sea un NULL... incluyendo los ceros.
O sea que te está contando hasta los ceros.

Para que veas que es cierto:
Código MySQL:
Ver original
  1. mysql> SELECT COUNT(0) cuenta;
  2. +--------+
  3. | cuenta |
  4. +--------+
  5. |      1 |
  6. +--------+
  7. 1 row in set (0.00 sec)

Por otro lado, hacer subconsultas en las columnas del SELECT es algo extremadamente ineficiente , ya que esas subconsultas se ejecutan una vez por cada registro devuelto por la consulta mayor. O sea que si esa consulta devolviese 1000 registros, cada subconsulta del SELECT se ejecutará 1000 veces...

¿Un espanto, no?

Tratemos de pulir un poco la cosa:
Código MySQL:
Ver original
  1.     CT.DESC_PRODUCTO PROD,
  2.     SUM(IF(FECHA = DATE_SUB(MAX(T1.DIA_REF), INTERVAL 6 DAY), 1, 0)) DIA_1,
  3.     SUM(IF(FECHA = DATE_SUB(MAX(T1.DIA_REF) AND FECHA = '2011-11-16', INTERVAL 5 DAY), 1, 0)) DIA_2,
  4.     SUM(IF(FECHA = DATE_SUB(MAX(T1.DIA_REF), INTERVAL 4 DAY), 1, 0)) DIA_3,
  5.     SUM(IF(FECHA = DATE_SUB(MAX(T1.DIA_REF), INTERVAL 3 DAY), 1, 0)) DIA_4,
  6.     SUM(IF(FECHA = DATE_SUB(MAX(T1.DIA_REF), INTERVAL 2 DAY), 1, 0)) DIA_5,
  7.     SUM(IF(FECHA = DATE_SUB(MAX(T1.DIA_REF), INTERVAL 1 DAY), 1, 0)) DIA_6,
  8.     SUM(IF(FECHA = T1.DIA_REF, 1, 0)) DIA_7
  9. FROM ces_ivr_eventos CE INNER JOIN ces_ivr_tipo_vel_inet CT ON CE.RUT = CT.RUT_PERSONA
  10.     JOIN (SELECT MAX(FECHA) DIA_REF FROM ces_ivr_eventos) T1
  11.     abrev_evento = 'internet' AND
  12.     FECHA BETWEEN DATE_SUB(MAX(T1.DIA_REF), INTERVAL 6 DAY) AND DIA_REF
  13. GROUP BY CT.DESC_PRODUCTO
  14. ORDER BY PROD;

No estoy muy seguro de que si es esto lo que quieres lograr, pero usando SUM() e IF() seguro que lograrás contar mejor que con ese enredo que estás haciendo ahora.

Lo que si, para poder ayudarte mejor sería bueno que nos explicases qué es lo que se supone que estás contando y qué es lo que deseas lograr. Porque la consulta que planteas es, como mínimo, confusa.
gracias por la respuesta, mira para explicar de mejor manera lo que quiero hacer es lo siguiente, en una empresa de telecomunicaciones llaman todos los días cierta cantidad de clientes, consultando por cierto producto, en este caso velocidades de internet lo que necesito es mostrar cuantas veces llamaron por cada velocidad en determinado dia ej: día 1 : 300k llamaron 31 veces.

lo que hice en mi código es hacer una referencia cruzada ocea que a la izquierda me muestre los nombres de las velocidades de internet y arriba una semana por eso puse el interval -6, -5, -4 ... al medio se encuentran las referencias cruzada ocea que por el tipo de velocidad cuantos clientes llamaron el dia 1, dia 2 ,etc...

el problema es que ya hice la estructura de la tabla con los case pero cuando cuento los llamados los del dia 1 perfecto sin problemas pero en los demas dias me muestra los mismos valores pese a que en el interval cambio los dias a consultar.

espero haberme explicado bien en esta ocacion quedo atento a sus respuestas, y gracias de antemano gracias te diste el tiempo de explicarme de mejor manera.
  #7 (permalink)  
Antiguo 12/12/2011, 11:50
Colaborador
 
Fecha de Ingreso: enero-2007
Ubicación: México
Mensajes: 2.097
Antigüedad: 17 años, 11 meses
Puntos: 447
Respuesta: Referencias Cruzadas

Hola de nuevo:

Tal como comenta gnzsoloyo, la consulta que quieres hacer la puedes obtener con SUM() y con IF's, pero sería conveniente que nos pongas la estructura completa de tus tablas para poder ayudarte a plantear la consulta. la idea sería más o menos así, supongamos que tienes una tabla con los siguientes datos:

Código MySQL:
Ver original
  1. mysql> SELECT * FROM tabla;
  2. +------+------------+----------+-----------+
  3. | id   | fecha      | servicio | velocidad |
  4. +------+------------+----------+-----------+
  5. |    1 | 2011-12-12 | internet |      1000 |
  6. |    2 | 2011-12-12 | internet |      2000 |
  7. |    3 | 2011-12-11 | internet |      2000 |
  8. |    4 | 2011-12-10 | internet |      1000 |
  9. |    5 | 2011-12-09 | otro     |      2000 |
  10. |    6 | 2011-12-10 | internet |      2000 |
  11. |    7 | 2011-12-11 | otro     |      2000 |
  12. |    8 | 2011-12-09 | internet |      2000 |
  13. |    9 | 2011-12-09 | otro     |      2000 |
  14. |   10 | 2011-12-09 | internet |      2000 |
  15. +------+------------+----------+-----------+
  16. 10 rows in set (0.00 sec)

utilizando entonces SUM() e IF() podrías hacer algo como esto.

Código MySQL:
Ver original
  1. mysql> SELECT
  2.     -> servicio, velocidad,
  3.     -> SUM(IF (fecha = CURDATE(), 1, 0)) hoy,
  4.     -> SUM(IF (fecha = DATE_SUB(CURDATE(), INTERVAL 1 DAY), 1, 0)) ayer,
  5.     -> SUM(IF (fecha = DATE_SUB(CURDATE(), INTERVAL 2 DAY), 1, 0)) antier,
  6.     -> SUM(IF (fecha = DATE_SUB(CURDATE(), INTERVAL 3 DAY), 1, 0)) hace_3_dias
  7.     -> FROM tabla T1
  8.     -> GROUP BY servicio, velocidad;
  9. +----------+-----------+------+------+--------+-------------+
  10. | servicio | velocidad | hoy  | ayer | antier | hace_3_dias |
  11. +----------+-----------+------+------+--------+-------------+
  12. | internet |      1000 |    1 |    0 |      1 |           0 |
  13. | internet |      2000 |    1 |    1 |      1 |           2 |
  14. | otro     |      2000 |    0 |    1 |      0 |           2 |
  15. +----------+-----------+------+------+--------+-------------+
  16. 3 rows in set (0.01 sec)

Creo que esto es más o menos lo que quieres hacer... haz el intento para ver si puedes obtener una consulta similar y si continuas con problemas nos comentas.

Saludos
Leo.

Etiquetas: campos, cruzadas, join, referencias, select, tabla
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:36.