Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Firebird e Interbase (https://www.clubdelphi.com/foros/forumdisplay.php?f=19)
-   -   Encontrar valor para el mínimo (https://www.clubdelphi.com/foros/showthread.php?t=96201)

Angel.Matilla 14-04-2023 18:13:05

Encontrar valor para el mínimo
 
Buenas tardes. Aquí estoy otra vez dando la lata.

Tengo esta tabla en FB:
Código SQL [-]
CREATE TABLE MESAS (
  CODIGO INTEGER NOT NULL,
  MUNICIPIO INTEGER DEFAULT 1 NOT NULL,
  DISTRITO SMALLINT NOT NULL,
  SECCION SMALLINT NOT NULL,
  MESA VARCHAR(2) CHARACTER SET ISO8859_1 DEFAULT 'U' NOT NULL COLLATE ES_ES_CI_AI);
que tiene, por ejemplo, estos datos:

Necesito un query que me dé el valor del campo código para el mínimo de la combinación Distrito, Sección y Mesa para cada municipio.

He hecho varias pruebas. Con este query:
Código SQL [-]
SELECT Municipio, MIN(Distrito||Seccion||Mesa)
FROM Mesas
Group BY Municipio
Obtengo esto:

Es correcto porque para cada municipio me dice el valor mínimo de la combinación. Sin embargo si en vez de municipio uso el campo código, que es el valor que necesito, así:
Código SQL [-]
SELECT Codigo, MIN(Distrito||Seccion||Mesa)
FROM Mesas
GROUP BY Codigo
lo que obtengo es esto:

Evidentemente este no es el resultado que me interesa porque me saca en la mayoría de los casos más de un resultado por municipio. He probado también con la cláusula HAVING:
Código SQL [-]
SELECT Codigo
FROM Mesas
GROUP BY Codigo
HAVING Distrito||Seccion||Mesa = MIN(Distrito||Seccion||Mesa)
pero las distintas combinaciones que he probado con ella me dan siempre el mismo error:
Cita:

Invalid token.
Dynamic SQL Error.
SQL error code = -104.
Invalid expression in the HAVING clause (neither an aggregate function nor a part of the GROUP BY clause).
y al traducirlo (mi inglés es muy limitado) me dice esto:
Cita:

Expresión no válida en la cláusula HAVING (ni una función agregada ni una parte de la cláusula GROUP BY).
cosa, por otra parte, que no entiendo. ¿Alguna sugerencia?

Casimiro Notevi 14-04-2023 21:12:02

No sé si es esto lo que quieres:
Código SQL [-]
select municipio, codigo, min(distrito||seccion||mesa)
from mesas
group by municipio, codigo

Angel.Matilla 15-04-2023 09:48:18

Cita:

Empezado por Casimiro Notevi (Mensaje 551161)
No sé si es esto lo que quieres:
Código SQL [-]
select municipio, codigo, min(distrito||seccion||mesa)
from mesas
group by municipio, codigo

Gracias. Ya lo había probado, se me olvidó ponerlo, y tampoco funciona.

Angel.Matilla 15-04-2023 10:00:23

Encontré la solución. No sé si será la mejor, pero funciona.
Código SQL [-]
SELECT A.Codigo, A.Municipio, A.Distrito||A.Seccion||A.Mesa
  FROM Mesas A
 WHERE A.Distrito||A.Seccion||A.Mesa = (SELECT MIN(Distrito||Seccion||Mesa) FROM Mesas WHERE Municipio = A.Municipio)
y me da una sola mesa por municipio.


La franja horaria es GMT +2. Ahora son las 18:38:06.

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