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 14-08-2007
Avatar de Gabo
[Gabo] Gabo is offline
Miembro Premium
 
Registrado: mar 2007
Ubicación: Murcia (España)
Posts: 684
Poder: 18
Gabo Va por buen camino
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 )

Última edición por Gabo fecha: 14-08-2007 a las 11:09:10. Razón: Cambio en el formato
Responder Con Cita
  #2  
Antiguo 14-08-2007
Avatar de gluglu
[gluglu] gluglu is offline
Miembro Premium
 
Registrado: sep 2004
Ubicación: Málaga - España
Posts: 1.455
Poder: 21
gluglu Va por buen camino
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.
__________________
Piensa siempre en positivo !
Responder Con Cita
  #3  
Antiguo 14-08-2007
Avatar de Gabo
[Gabo] Gabo is offline
Miembro Premium
 
Registrado: mar 2007
Ubicación: Murcia (España)
Posts: 684
Poder: 18
Gabo Va por buen camino
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 )...

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...
Responder Con Cita
  #4  
Antiguo 14-08-2007
Avatar de ArdiIIa
[ArdiIIa] ArdiIIa is offline
Miembro Premium
 
Registrado: nov 2003
Ubicación: Valencia city
Posts: 1.481
Poder: 22
ArdiIIa Va por buen camino
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.
__________________
Un poco de tu generosidad puede salvar la vida a un niño. ASÍ DE SENCILLO
Responder Con Cita
  #5  
Antiguo 14-08-2007
Avatar de gluglu
[gluglu] gluglu is offline
Miembro Premium
 
Registrado: sep 2004
Ubicación: Málaga - España
Posts: 1.455
Poder: 21
gluglu Va por buen camino
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
__________________
Piensa siempre en positivo !
Responder Con Cita
  #6  
Antiguo 14-08-2007
Avatar de Gabo
[Gabo] Gabo is offline
Miembro Premium
 
Registrado: mar 2007
Ubicación: Murcia (España)
Posts: 684
Poder: 18
Gabo Va por buen camino
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
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

Temas Similares
Tema Autor Foro Respuestas Último mensaje
copiar campos de una tabla a otra en paradox Camilo Varios 18 27-06-2007 21:51:26
actualizar datos de una tabla según datos de otra. GustavoCruz SQL 10 01-06-2007 23:18:44
Actualizar una tabla con una consulta de otra tabla JODELSA SQL 2 14-09-2006 04:07:01
Cambiar de color una fila de un Dbgrid segun una condicion... hook Varios 5 12-07-2005 23:40:36
Cosultar datos de una tabla y copiar la consulta en otra JODELSA SQL 2 30-05-2005 21:53:30


La franja horaria es GMT +2. Ahora son las 08:40:59.


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