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 15-07-2008
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
Consulta en Firebird 2.1 e Interbase 7.5

Hola a tod@s !

Me he topado con que esta consulta me funciona en Interbase 7.5 pero no me funciona en Firebird 2.1

Código SQL [-]
Select BO.DATEFROM, BO.DATETO, CA2.CATEGORYNO,
(Select Count(*) from OBJECTS OB
 left join CATEGORIES CA1
   on OB.CATEGORYNO      = CA1.CATEGORYNO
   and CA1.SUBCATEGORYNO = 0
 where OB.BUILDINGNO = 1
 and CA1.CATEGORYNO  = BO.CATEGORYNO) as SumCount
from BOOKINGS_OBJECTS_TEMP BO
left join CATEGORIES CA2
  on BO.CATEGORYNO      = CA2.CATEGORYNO
  and CA2.SUBCATEGORYNO = 0
where CA2.DIVISIONTYPE    = 0
and CA2.OBJECTRESERVATION = 0
group by BO.DATEFROM, BO.DATETO, CA2.CATEGORYNO

Sin entrar demasiado en detalles de qué es lo que devuelve la consulta, voy al error que me lanza Firebird cuando ejecuta la consulta : 'Invalid expression in the select list (not contained in either an aggregate function or the GROUP BY clause).'

El error está en el campo coloreado en negrita. Al parecer no puedo incluir ese campo que es parte de la consulta posterior en Firebird, en cambio en interbase si me lo permite.

Si cambio BO.CATEGORYNO en la subconsulta de la suma por un valor cualquiera (p.ej. 1) si me funciona en Firebird.

A lo mejor alguien me puede ayudar en la solución para Firebird.

Lo que trato es de obtener junto con una consulta agrupada por tres campos diferentes, el número total de registros (en la subconsulta) por cada una de esas agrupaciones.

Gracias por vuestros consejos
__________________
Piensa siempre en positivo !
Responder Con Cita
  #2  
Antiguo 15-07-2008
[egostar] egostar is offline
Registrado
 
Registrado: feb 2006
Posts: 6.557
Poder: 25
egostar Va camino a la fama
Hola

Código SQL [-]
group by 1, 2, 3

Salud OS
__________________
"La forma de empezar es dejar de hablar y empezar a hacerlo." - Walt Disney
Responder Con Cita
  #3  
Antiguo 16-07-2008
hecospina hecospina is offline
Miembro
 
Registrado: oct 2007
Posts: 202
Poder: 17
hecospina Va por buen camino
Hola
Lo que yo veo es que te sobra el group by, en la sentencia no tienes ninguna funcion de agregado
Prueba sin el group by
Responder Con Cita
  #4  
Antiguo 16-07-2008
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
Gracias a los dos por contestar.

Ninguna de las dos opcines me soluciona el asunto. Si pongo group by 1, 2, 3 me devuelve el mismo error. Y sí, si que tengo que agrupar porque si no me daría toda una lista individual de registros.

Intentaré explicar de nuevo el sentido de la consulta : en una tabla (BOOKINGS_OBJECTS_TEMP) tengo una serie de registros (pueden ser miles) los cuales quiero obtener agrupados por los tres campos indicados. Una vez obtenidos estos grupos, necesitaría obtener de otra tabla diferente (OBJECTS) el número de registros que cumplen la condición de uno de los campos que obtengo en la 1ª consulta agrupada (en este caso el campo a considerar sería CATEGORYNO que es devuelto en la 1ª consulta).

Por eso utilizé una consulta anidada, en la cual la subconsulta utiliza una de los campos devueltos por la consulta principal.

En Interbase funciona correctamente, pero en Firebird 2.1 me devuelve el error descrito. Al parecer precisamente por plantearlo de la manera que lo planteo, es decir, utilizar un campo de la consulta principal agrupada en la subconsulta.

Está claro que lo podría hacer en dos consultas independientes. Pero ese no era el objetivo de este hilo. Es averiguar por qué una cosa que me funcionaba correctamente en Interbase no la puedo utilizar de la manera prevista en Firebird, y como resolverlo.

Gracias de nuevo por vuestra ayuda.
__________________
Piensa siempre en positivo !
Responder Con Cita
  #5  
Antiguo 16-07-2008
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


Código SQL [-]
Select BO.DATEFROM, BO.DATETO, CA2.CATEGORYNO,
(Select Count(*) from OBJECTS OB
 left join CATEGORIES CA1
   on OB.CATEGORYNO      = CA1.CATEGORYNO
   and CA1.SUBCATEGORYNO = 0
 where OB.BUILDINGNO = 1
 and CA1.CATEGORYNO  = CA2.CATEGORYNO) as SumCount
from BOOKINGS_OBJECTS_TEMP BO
left join CATEGORIES CA2
  on BO.CATEGORYNO      = CA2.CATEGORYNO
  and CA2.SUBCATEGORYNO = 0
where CA2.DIVISIONTYPE    = 0
and CA2.OBJECTRESERVATION = 0
group by BO.DATEFROM, BO.DATETO, CA2.CATEGORYNO

Basta con cambiar BO.CATEGORYNO por CA2.CATEGORYNO. Así funciona correctamente la consulta.

Al parecer Firebird 2.1 no entiende la referencia (asunto que realmente es correcto) a BO.CATEGORYNO como campo devuelto por BOOKINGS_OBJECTS_TEMP cuyo alias es BO, sino al ser un campo devuelto por el left join de la consulta principal (CATEGORIES) cuyo alias es CA2, pues por lo visto, y vuelvo a decir que con razón, hay que referenciarlo por los alias como CA2 y no como BO, al igual que lo referencia en el Select propio o en el Group By.

Vamos, que Firebird me ha detectado realmente un error de referencias que Interbase acepta.
__________________
Piensa siempre en positivo !
Responder Con Cita
  #6  
Antiguo 16-07-2008
celades1 celades1 is offline
Miembro
 
Registrado: ago 2005
Posts: 116
Poder: 19
celades1 Va por buen camino
Hola

Código SQL [-]
Select distinct BO.DATEFROM, BO.DATETO, CA2.CATEGORYNO,
(Select Count(*) from OBJECTS OB
 left join CATEGORIES CA1
   on OB.CATEGORYNO      = CA1.CATEGORYNO
   and CA1.SUBCATEGORYNO = 0
 where OB.BUILDINGNO = 1
 and CA1.CATEGORYNO  = BO.CATEGORYNO) as SumCount
from BOOKINGS_OBJECTS_TEMP BO
left join CATEGORIES CA2
  on BO.CATEGORYNO      = CA2.CATEGORYNO
  and CA2.SUBCATEGORYNO = 0
where CA2.DIVISIONTYPE    = 0
and CA2.OBJECTRESERVATION = 0


Pero no entiendo que hace el left join de la subconsulta yo haria join sin left

Tampoco entiendo porque no te funciona tal como lo tienes porque lo veo bien


Saludos
Responder Con Cita
  #7  
Antiguo 16-07-2008
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
Con el 'distinct' funciona también correctamente, gracias
__________________
Piensa siempre en positivo !
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
Consulta en Interbase rruffino Conexión con bases de datos 4 25-04-2007 23:06:56
consulta de interbase ivanloco Varios 1 27-11-2006 21:33:30
Consulta interbase ivanloco Firebird e Interbase 2 22-11-2006 17:16:01
Consulta SQL de interbase con delphi 7 Durbed Conexión con bases de datos 2 24-11-2004 15:08:31
Consulta Interbase trex2000 Conexión con bases de datos 1 26-09-2004 14:43:14


La franja horaria es GMT +2. Ahora son las 21:30:49.


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