PDA

Ver la Versión Completa : consultas anidadas: group by dentro otro group by


DobleSiete
25-01-2005, 13:59:02
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.

DobleSiete
27-01-2005, 16:05:50
Me disculpan la pesima explicación, la replanteo de otra manera: Esta es la consulta que tengo y deseo corregir:

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


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

marcoszorrilla
27-01-2005, 17:28:54
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.

DobleSiete
27-01-2005, 18:09:18
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 ...

lucianojdg
31-01-2005, 13:27:15
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).

DobleSiete
31-01-2005, 14:18:27
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:


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)


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:


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:

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

lucianojdg
31-01-2005, 14:34:06
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

DobleSiete
31-01-2005, 14:59:31
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...