Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   SQL (https://www.clubdelphi.com/foros/forumdisplay.php?f=6)
-   -   Consulta en Firebird 2.1 e Interbase 7.5 (https://www.clubdelphi.com/foros/showthread.php?t=58296)

gluglu 15-07-2008 20:55:12

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 ;)

egostar 15-07-2008 21:04:13

Hola

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

Salud OS

hecospina 16-07-2008 00:16:06

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

gluglu 16-07-2008 09:44:49

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

gluglu 16-07-2008 09:56:03

:eek: :eek: :rolleyes:

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. :p :o

celades1 16-07-2008 10:00:29

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

gluglu 16-07-2008 10:56:01

Con el 'distinct' funciona también correctamente, gracias ;)


La franja horaria es GMT +2. Ahora son las 08:31:42.

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