Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   SQL (https://www.clubdelphi.com/foros/forumdisplay.php?f=6)
-   -   Consulta que obtiene campos de una tabla u otra según condición (https://www.clubdelphi.com/foros/showthread.php?t=46931)

Gabo 14-08-2007 11:00:17

Consulta que obtiene campos de una tabla u otra según condición
 
Hola a tod@s!

Tengo un problema con una consulta a la que no le veo salida...

Tengo dos tablas:

Código:

A              B
********      ********
A_CODIGO      B_CODIGO
A_CANTIDAD    A_CODIGO
A_BORRADO      B_CANTIDAD_REAL
              B_BORRADO

El tema es el siguiente: la cantidad real de un ítem de la tabla A es la sumatoria de los registros B_CANTIDAD_REAL relacionados. Ahora bien, si no hay ningún registro en la tabla B relacionado con la tabla A, el valor que vale (aunque no sea el real, sino un estimado) es el de A_CANTIDAD.

Así, si quisieramos hacer un resumen del tipo:

Código:

CODIGO CANTIDAD
****** ********
000001 236
000002 568
000003 1236

en ocasiones la cantidad la tomaría de A_CANTIDAD, y en otras de la sumatoria de B_CANTIDAD_REAL.

He aquí la pregunta: ¿Cómo puedo, mediante una consulta SQL, hacer que me traiga dicha información?

He intentado varias soluciones pero no me resulta ninguna... por ejemplo:

Código SQL [-]
select a_codigo, a_cantidad from a 
where a_borrado=0 and a_codigo not in
(select a_codigo from b where b_borrado=0)
union all
select a_codigo, sum (b_cantidad_real) as suma from b
where b_borrado=0 group by a_codigo

Ambas consultas me funcionan por separado, pero si las uno, me da el error: "tipo de dato desconocido"...

Gracias de antemano por la ayuda que me puedan dar para sacar adelante esta consulta (me da vergüenza, pero no le veo salida :p)

gluglu 14-08-2007 11:20:56

Has probado a utilizar un 'CASE' dentro del propio Select ?

Algo así como :

Código SQL [-]
Select a_codigo,
Case when a_borrado=0 and a_codigo not in
(select a_codigo from b where b_borrado=0) then a_cantidad
else
(select sum (b_cantidad_real) as suma from b
where b_borrado=0 group by a_codigo)
end
from a

Nota : No he probado la sentencia, por lo que no puedo asegurar que la sintaxis sea la correcta. Pero intento darte la idea para que la desarrolles tu mismo. ;)

Gabo 14-08-2007 13:15:03

Gracias gluglu por tu respuesta!

He probado la consulta que me has dicho, asi como otras variantes según cosas que ví en otros hilos sobre esta función (la que desconocía, por cierto :rolleyes:)...

Sin embargo, en todas las formas que he probado me da el error "token unknown" en "when"... No sé si será problema de que no está incluida la función (utilizo Interbase versión 6)... De hecho el case no me lo pone en negrita como cuando reconoce un palabra reservada, aunque el when sí y es donde realmente me marca el problema...

¿Sabes si esta incluido el Case en Interbase 6? Por lo menos, en la documentación adjunta no me aparece...

ArdiIIa 14-08-2007 13:23:16

No conozco las posibilidades de Interbase 6, pero con Firebird 2 y sus extensiones, lo tendrías resuelto fácilmente.
Por ejemplo con COALESCE
Cita:

Function:
Allow a column value to be calculated by a number of expressions,
the first expression returning a non NULL value is returned as the
column value
Yo habitualmente, si no tengo claro como armar un query, recurro a un Stored Procedure y soluciono el problema.

gluglu 14-08-2007 13:36:28

Yo utilizo Interbase 7.5 y no tengo problemas con 'Case'. La verdad es que desconozco si la función está implementada en Interbase 6.

COALESCE también está implementada en Interbase 7.5

Gabo 14-08-2007 14:11:08

Sólo que por ahora no tengo contemplado hacer ningún cambio...

¿Podrían decirme si la sintaxis de esta consulta es correcta?

Código SQL [-]
select cliente_codigo,
case when cliente_borrado=0 then cliente_poblacion
else cliente_provincia
end
from cliente

Es que a mi me falla ("token unknown") y si está correcta, simplemente es que no existe en la versión 6 de Interbase...:(

Gracias

gluglu 14-08-2007 14:29:58

Siempre y cuando Cliente_Provincia y Cliente_Poblacion sean del mismo tipo, es correcta.

Ya he probado otra parecida con una de mis tablas en Interbase 7.5 y sin problema alguno. :o

Gabo 14-08-2007 15:03:48

Sí, son del mismo tipo... Por lo que veo el tema es que no está disponible en la versión 6 de Interbase... :(

Gracias gluglu por hacer la comprobación...:)

Seguiré intentando por que tiene que haber alguna otra manera de hacerlo...

Gabo 16-08-2007 12:09:21

Sigo haciendo pruebas... he intentado volver a la idea original...

Como les mencionaba, esta consulta...

Código SQL [-]
select a_codigo, a_cantidad from a 
where a_borrado=0 and a_codigo not in
(select a_codigo from b where b_borrado=0)
union all
select a_codigo, sum (b_cantidad_real) as suma from b
where b_borrado=0 group by a_codigo

... me da el error de tipo de dato desconocido:

Código:

Dynamic SQL Error
SQL error code = -104
Invalid command
Data type unknown

Ambas consultas me funcionan bien por separado y no entiendo bien el error, ya que los tipos de datos (tanto de a_cantidad, como de b_cantidad_real) son iguales, Integer en ambos casos. ¿A qué se puede deber el error? :confused:

hach 17-08-2007 21:23:09

prueba con esta consulta, deberia funcionar
 
Código SQL [-]
select a_codigo, sum(a_cantidad) from a
where a_borrado=0 and a_codigo not in
(select a_codigo from b where b_borrado=0)
group by a_codigo
union
select a_codigo, sum (b_cantidad_real) from b
where b_borrado=0
group by a_codigo

Espero te sirva!!!

Saludos

Gabo 20-08-2007 08:53:02

Muchas gracias
 
Increíble!!! :eek:

Esta mañana llegué con la idea de incorporar un nuevo campo en la tabla A que me sumara los registros asociados de B al insertarlos para facilitar la consulta después... cosa que en principio no me gustaba mucho, ya que se trataría de un campo cuyo contenido es el resultado de operaciones sobre otros, pero ya me estaba dando por vencido...:(

En eso, me encuentro la respuesta de hach... ¡Muchas gracias! Me pareció lógica en cuanto la ví, si la unión no la podía hacer por que en una select ocupaba la función SUM y no me reconocía los tipos de datos, ¿porqué no usar la función SUM en ambas? :rolleyes:

Gracias de nuevo, y también a todos los que me ayudaron...:)


La franja horaria es GMT +2. Ahora son las 10:35:35.

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