Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > SQL
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 25-01-2005
DobleSiete DobleSiete is offline
Miembro
 
Registrado: ene 2005
Posts: 32
Poder: 0
DobleSiete Va por buen camino
consultas anidadas: group by dentro otro group by

Tengo una consulta con dos consultas encadenadas con un UNION, y cada SELECT tiene la clausula GROUP BY...

Hasta aquí todo bien, el problema es que en el resultado obtengo un registro repetido (por que existe en dos tablas diferentes) lo que deseo es que estos dos registros sean sumados, usando SUM() pero para hacer esto tengo que anidar la consulta en otra que tambien debe tener un GROUP BY, pero siempre obtengo un mensaje de error, estoy algo perdido y no se de que otra manera hacer la consulta.

RDBMS: Interbase 6.5

Gracias a todos por cualquier sugerencia o ayuda que pudiesen facilitarme.
__________________
"Nadie es perfecto" (Don Nadie)
Responder Con Cita
  #2  
Antiguo 27-01-2005
DobleSiete DobleSiete is offline
Miembro
 
Registrado: ene 2005
Posts: 32
Poder: 0
DobleSiete Va por buen camino
Question

Me disculpan la pesima explicación, la replanteo de otra manera: Esta es la consulta que tengo y deseo corregir:

[
Código SQL [-]
  SELECT   cod_cta, 
           est_fnz, 
           SUM(total_bs) AS total_bs
  FROM     cbpmov01
  WHERE    est_fnz = '6160' AND
           tipo NOT IN ('NC', 'ND')
  GROUP BY cod_cta, 
           est_fnz
  UNION
  SELECT   cod_cta, 
           est_fnz, 
           SUM(total_bs) AS total_bs
  FROM     cbpmov02
  WHERE    est_fnz = '6160'
  GROUP BY cod_cta, 
           est_fnz

Esta consulta me genera el siguiente resultado:

Código:
  COD_CTA         EST_FNZ    TOTAL_BS                              
  ============    =======    ==================================    
  1101007         6160                                      -85    
  6160001         6160                                   -68950    
  6160002         6160                              -1738280,55    
  6160002         6160                                 -8982,18
Como ven, los dos últimos registros tienen el mismo codigo de cuenta y el mismo estado financiero, lo que quiero es agrupar esos dos por el campo cod_cta, para obtener la suma... eso es todo.

Asumo que debo usar una subconsulta, pero no puedo colocar dos consultas enlazadas con UNION como subconsulta de otra...

Muchas gracias a todos
__________________
"Nadie es perfecto" (Don Nadie)

Última edición por DobleSiete fecha: 27-01-2005 a las 16:18:13.
Responder Con Cita
  #3  
Antiguo 27-01-2005
Avatar de marcoszorrilla
marcoszorrilla marcoszorrilla is offline
Capo
 
Registrado: may 2003
Ubicación: Cantabria - España
Posts: 11.221
Poder: 10
marcoszorrilla Va por buen camino
Has probado a ver si haciendo una vista con esta consulta, luego te deja lanzar otra consulta sobre ésta obteniendo los resultados que buscas.?

Un Saludo.
__________________
Guía de Estilo de los Foros
Cita:
- Ça c'est la caisse. Le mouton que tu veux est dedans.
Responder Con Cita
  #4  
Antiguo 27-01-2005
DobleSiete DobleSiete is offline
Miembro
 
Registrado: ene 2005
Posts: 32
Poder: 0
DobleSiete Va por buen camino
Hoy estuve leyendo un poco sobre el tema de las vistas en el libro de Navathe/Elsmari, pero regrese a las consultas casi convencido de que se podía con una subconsulta, pero lo veo imposible porque necesito traer el resultado de dos SUM() de la consulta interna hacia la consulta externa, si se puede puede con una consulta, pues bien, si no, probare con una vista...

Si tienes algun ejemplo que me sirva de orientación te lo agradecería ...

Muchas gracias por tu respuesta ...
Responder Con Cita
  #5  
Antiguo 31-01-2005
lucianojdg lucianojdg is offline
Miembro
 
Registrado: dic 2003
Posts: 42
Poder: 0
lucianojdg Va por buen camino
Smile 3 uniones

Se me ocurre que podria ser de la siguiente manera:


SELECT M1.cod_cta, M1.est_fnz, SUM(M1.total_bs) AS total_bs
FROM cbpmov01 M1
WHERE M1.est_fnz = '6160' AND
M1.tipo NOT IN ('NC', 'ND')
AND NOT EXISTS (Select M02.cod_cta
from cbpmov02 M02
Where M02.cod_cta = M1.cod_cta
and M02.est_fnz = M1.est_fnz)
GROUP BY M1.cod_cta,
M1.est_fnz
UNION
SELECT M2.cod_cta,
M2.est_fnz,
SUM(M2.total_bs) AS total_bs
FROM cbpmov02 M2
WHERE M2.est_fnz = '6160'
AND NOT EXISTS (Select M01.cod_cta
from cbpmov01 M01
Where M01.cod_cta = M2.cod_cta
and M01.est_fnz = M2.est_fnz)
GROUP BY M2.cod_cta,
M2.est_fnz

UNION
SELECT M1.cod_cta,
M1.est_fnz,
SUM(M1.total_bs + M2.total_bs) AS total_bs
FROM cbpmov01 M1, cbpmov02 M2
WHERE M1.est_fnz = '6160'
and M1.cod_cta = M2.cod_cta
and M1.est_fnz = M2.est_fnz
GROUP BY M2.cod_cta,
M2.est_fnz


Te explico: El primer select te va a traer todas las cuentas que estan unicamente en la tabla cbpmov01, el segundo select te va a traer solo las cuentas que estan en la tabla cbpmov02 y el tercer select te va a traer las cuentas que estan en ambas tablas agrupadas por cuenta y estado financiero (yo asumi que ambas son clave primarias, pero si no es asi, quedaria mas simple todavia).
Responder Con Cita
  #6  
Antiguo 31-01-2005
DobleSiete DobleSiete is offline
Miembro
 
Registrado: ene 2005
Posts: 32
Poder: 0
DobleSiete Va por buen camino
Hola Luciano,

Ya había pensado en tu solución pero no recuerdo si la implementé o no... de cualquier manera la probe y me devuelve el siguiente error en IBOConcole:

Código:
 ISC ERROR CODE:335544569
 
 ISC ERROR MESSAGE:
 Dynamic SQL Error
 SQL error code = -104
 invalid column reference
De todos modos ya encontre la solución: usando una vista, totalctabco (muchas gracias a marcoszorrilla por su sugerencia)

Código SQL [-]
 CREATE VIEW totalctabco (cod_cta, est_fnz, total_bs) AS
 
   SELECT   cod_cta, est_fnz, SUM(total_bs) AS total_bs
   FROM     cbpmov01
   WHERE    est_fnz = '6160' AND tipo NOT IN ('NC', 'ND')
   GROUP BY cod_cta, est_fnz
 
   UNION
 
   SELECT   cod_cta, est_fnz, SUM(total_bs) AS total_bs
   FROM     cbpmov02
   WHERE    est_fnz = '6160'
   GROUP BY cod_cta,  est_fnz

Luego uso la vista totalctabco desde otro SELECT:

Código SQL [-]
 SELECT   cod_cta, est_fnz, SUM(total_bs) AS total_bs
 FROM     totalctabco
 GROUP BY cod_cta, est_fnz

Con este SELECT obtengo el resultado que estaba buscando:
Código:
 COD_CTA         EST_FNZ    TOTAL_BS                              
 ============    =======    ==================================    
 1101007         6160                                      -85    
 6160001         6160                                   -68950    
 6160002         6160                              -1747262,73
Las dos últimas filas (6160002) ahora son una sola y las columnas total_bs correspondientes ahora están sumadas ....

De cualquier manera prefiero hacerlo sin vistas, si llego a cometer algún error en la vista, debo modificarla para luego ejecutar nuevamente un SELECT...

Otros dos grandes problemas:
1. No puedo colocar dentro de una vista un FROM hacia una tabla vacía, InterBase 6.5 cierra la conexión con la base de datos.
2. No como pasarle parametros a una vista desde Delphi (si alguien lo ha hecho, por favor me ilumine).

Gracias por sus sugerencias ...
__________________
"Nadie es perfecto" (Don Nadie)
Responder Con Cita
  #7  
Antiguo 31-01-2005
lucianojdg lucianojdg is offline
Miembro
 
Registrado: dic 2003
Posts: 42
Poder: 0
lucianojdg Va por buen camino
Smile

Si, es verdad, el error esta en el Group By de la ultima union, fijate que escribi mal los alias, deberian ser M1 en vez de M2

Como vos decis, es preferible hacer la consulta sin una vista como paso intermedio... Pero bueno, si yo lo implementaste asi esta bien...


Saludos


Luciano
Responder Con Cita
  #8  
Antiguo 31-01-2005
DobleSiete DobleSiete is offline
Miembro
 
Registrado: ene 2005
Posts: 32
Poder: 0
DobleSiete Va por buen camino
Ok Luciano, hice el cambio en el alias del GROUP BY y realizó la suma, pero el resultado del SUM no es el correcto, al menos para el último registro: esto es lo que obtengo en total_bs: -21.254.582,52

Tendría que revisarlo con mas detalle, no se cual será el problema...
__________________
"Nadie es perfecto" (Don Nadie)

Última edición por DobleSiete fecha: 31-01-2005 a las 15:11:52.
Responder Con Cita
Respuesta



Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro


La franja horaria es GMT +2. Ahora son las 14:19:40.


Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi
Copyright 1996-2007 Club Delphi