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

Consulta de referencias cruzadas

Estas en el tema de Consulta de referencias cruzadas en el foro de Bases de Datos General en Foros del Web. Estoy intentando meter lo que serian 4 consultas a una misma tabla en columnas por importe pero no hay manera. El codigo tiene que ser ...
  #1 (permalink)  
Antiguo 16/06/2009, 10:08
 
Fecha de Ingreso: junio-2009
Mensajes: 5
Antigüedad: 15 años, 7 meses
Puntos: 0
Consulta de referencias cruzadas

Estoy intentando meter lo que serian 4 consultas a una misma tabla en columnas por importe pero no hay manera.
El codigo tiene que ser en SQL standard ya que hay un interprete en medio que no acepta funciones especificas ni de sqlserver, ni oracle, ni mysql.

Ahi va el codigo:
Código:
select cliente, sum(importe) from comunes!previ_cl where banco=" " AND vencim between (emision) AND (emision+29) group by cliente
select cliente, sum(importe) from comunes!previ_cl where banco=" " AND vencim between (emision+30) AND (emision+60) group by cliente
select cliente, sum(importe) from comunes!previ_cl where banco=" " AND vencim between (emision+61) AND (emision+90) group by cliente
select cliente, sum(importe) from comunes!previ_cl where banco=" " AND vencim > (emision+90) group by cliente
He probado tambien con TRANSFORM & PIVOT pero no lo acepta. Tambien he probado con inner joins vinculando sobre la misma tabla (para crear las columnas de importe) pero no hay manera.

Probablemente sea una xorrada pero no lo encuentro, asi que agradeceria si alguien me pudiera echar una manita con el tema.

Gracias por adelantado.
  #2 (permalink)  
Antiguo 16/06/2009, 10:27
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, 1 mes
Puntos: 2658
Respuesta: Consulta de referencias cruzadas

Prueba:
Código sql:
Ver original
  1. SELECT CLIENTE, SUM29, SUM30, SUM60, SUM90
  2. FROM
  3.     (SELECT cliente, SUM(importe) SUM29
  4.     FROM comunes!previ_cl
  5.     WHERE banco=" " AND vencim BETWEEN (emision) AND (emision+29) GROUP BY cliente) AS t1
  6.     LEFT JOIN
  7.     (SELECT cliente, SUM(importe) SUM30
  8.     FROM comunes!previ_cl
  9.     WHERE banco=" " AND vencim BETWEEN (emision+30) AND (emision+60) GROUP BY cliente) T2
  10.     ON T1.CLIENTE = T2.CLIENTE
  11.     LEFT  JOIN
  12.      (SELECT  cliente, SUM(importe) SUM60
  13.     FROM comunes!previ_cl
  14.     WHERE banco=" " AND vencim BETWEEN (emision+61) AND (emision+90) GROUP BY cliente) T3
  15.     ON T1.CLIENTE = T3.CLIENTE
  16.     LEFT JOIN
  17.     (SELECT  cliente, SUM(importe) SUM90
  18.     FROM comunes!previ_cl
  19.     WHERE banco=" " AND vencim > (emision+90) GROUP BY cliente) T4
  20.     ON T1.CLIENTE = T4.CLIENTE;
el problema fundamental puede darse sin la primera de las tablas no devuelve alguno de los clientes de las tres siguientes.
Para que esto funcionase bien, habría que hacer un LEFT JOIN entre la tabla de clientes y la primera de estas consultas... Pero la solución que yo le encuentro está dentro de este esquema.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #3 (permalink)  
Antiguo 16/06/2009, 11:12
 
Fecha de Ingreso: junio-2009
Mensajes: 5
Antigüedad: 15 años, 7 meses
Puntos: 0
Respuesta: Consulta de referencias cruzadas

Bueno he estado probando el codigo y no funciona. Lo mas cerca que he estado a sido con:

Código:
SELECT t1.cliente, SUM(t11.importe), SUM(t2.importe), SUM(t3.importe, SUM(t4.importe) 
FROM comunes!previ_cl t1 LEFT JOIN comunes!previ_cl t11 ON t1.cliente=t11.cliente AND t1.vencim between (t1.emision) AND (t1.emision+29) 
LEFT JOIN comunes!previ_cl t2 ON t1.cliente=t2.cliente AND t2.vencim between (t2.emision+30) AND (t2.emision+60)
LEFT JOIN comunes!previ_cl t3 ON t1.cliente=t3.cliente AND t3.vencim between (t3.emision+61) AND (t3.emision+90)
LEFT JOIN comunes!previ_cl t4 ON t1.cliente=t4.cliente AND t4.vencim > (t4.emision+90)
WHERE t1.banco="	" 
GROUP BY t1.cliente
El problema es que no m muestra ni la 3a ni la 4a columna, cuando por datos almenos hay un cliente en la 3a. Supongo que será porque en las primeras dos columnas hay null.

Alguna solución/alternativa al problema? Gracias.
  #4 (permalink)  
Antiguo 16/06/2009, 11:36
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, 1 mes
Puntos: 2658
Respuesta: Consulta de referencias cruzadas

Cita:
El problema es que no m muestra ni la 3a ni la 4a columna, cuando por datos almenos hay un cliente en la 3a. Supongo que será porque en las primeras dos columnas hay null.

Alguna solución/alternativa al problema? Gracias.
Exactamente por eso es que te decía:
Cita:
Para que esto funcionase bien, habría que hacer un LEFT JOIN entre la tabla de clientes y la primera de estas consultas... Pero la solución que yo le encuentro está dentro de este esquema.
La idea es que todos los LEFT JOIN se enlacen con la tabla clientes.

Por otro lado, el resultado de las consultas puede variar en algunos DBMS. ¿Con qué lo estás ejecutando?
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #5 (permalink)  
Antiguo 16/06/2009, 11:53
 
Fecha de Ingreso: junio-2009
Mensajes: 5
Antigüedad: 15 años, 7 meses
Puntos: 0
Respuesta: Consulta de referencias cruzadas

Es un programa de gestion programada en visualFOX (no por mi) con una una BD SQLSERVER 2005. El problema es que no puedo meter instrucciones especificas de SQLSERVER porque para generar el informe tengo que pasar por un filtro de FOX que solo coje SQL standard
  #6 (permalink)  
Antiguo 16/06/2009, 12:05
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, 1 mes
Puntos: 2658
Respuesta: Consulta de referencias cruzadas

¿Y tienes acceso a la tabla CLIENTES?
Con eso como T1, debería andar. Sino, hay que crear una tabla temporal con todos los clientes que aparezcan en las cuatro consultas.
Eso se puede hacer con otras consulta...
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #7 (permalink)  
Antiguo 17/06/2009, 01:25
 
Fecha de Ingreso: junio-2009
Mensajes: 5
Antigüedad: 15 años, 7 meses
Puntos: 0
Respuesta: Consulta de referencias cruzadas

Como el informe (report) va sobre el propio programa no es posible trabajar directamente sobre la BD, por lo tanto no puedo generar ninguna tabla adicional.
Por otra parte si tengo acceso a todas las tablas de la BD. Probare vinculando sobre clientes y te digo algo.
  #8 (permalink)  
Antiguo 17/06/2009, 02:12
 
Fecha de Ingreso: junio-2009
Mensajes: 5
Antigüedad: 15 años, 7 meses
Puntos: 0
Respuesta: Consulta de referencias cruzadas

Bien ahora nos acercamos un poquito mas.

Creo que es un poco chapuzilla (eficiencia) pero ahora mismo tengo algo como esto:

Código:
SELECT c.codigo, c.nombre, SUM(t1.importe) AS 'SUMA29', SUM(t2.importe) AS 'SUMA30', SUM(t3.importe) AS 'SUMA60', SUM(t4.importe) AS 'SUMA91' 
FROM gestion!clientes c LEFT JOIN comunes!previ_cl t1 ON c.codigo=t1.cliente AND t1.banco=" 	" AND t1.vencim between (t1.emision) AND (t1.emision+29) 
LEFT JOIN comunes!previ_cl t2 ON c.codigo=t2.cliente AND t2.banco=" 	" AND t2.vencim between (t2.emision+30) AND (t2.emision+60)
LEFT JOIN comunes!previ_cl t3 ON c.codigo=t3.cliente AND t3.banco=" 	" AND t3.vencim between (t3.emision+61) AND (t3.emision+90)
LEFT JOIN comunes!previ_cl t4 ON c.codigo=t4.cliente AND t4.banco=" 	" AND t4.vencim > (t4.emision+90)
WHERE c.codigo IN (SELECT cliente FROM comunes!previ_cl WHERE banco="	")
GROUP BY c.codigo
El problema principal es que si un mismo cliente tiene importes en diferentes columnas de vencimientos (vencim) me dobla el importe que le tocaria a cada columna. Alguien tiene algunda idea?

Me trae bastante de cabeza esta consulta :&

Última edición por trallador; 17/06/2009 a las 03:10
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

SíEste tema le ha gustado a 1 personas




La zona horaria es GMT -6. Ahora son las 07:17.