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)
-   -   Group By (https://www.clubdelphi.com/foros/showthread.php?t=61343)

fcios 04-11-2008 17:45:14

Group By
 
Hola, utilizo Firebird 2.1, yo creo que esto se debería hacer con un GROUP BY pero no puedo,
gracias de antemano

Quiero saber en que últimos movimientos está involucrada la oficina 1

-- Agrego un par de valores para tener con que hacer la prueba
/* CREO UNA TABLA */
CREATE TABLE MOVIMIENTOS (
MOV_ID INTEGER NOT NULL, -- id de esta tabla
OFI_ID INTEGER NOT NULL, -- id de la tabla OFICINAS
MOV_FECHA CHAR(8) NOT NULL, -- fecha del movimiento
ENT_ID INTEGER NOT NULL -- id de la tabla ENTRADAS
);

-- con 2 movimientos para cada entrada ENT_ID 40, 41 y 42
INSERT INTO movimientos (MOV_ID, OFI_ID, MOV_FECHA,ENT_ID) VALUES
(1, 1, '20081101',40);
INSERT INTO movimientos (MOV_ID, OFI_ID, MOV_FECHA,ENT_ID) VALUES
(2, 2, '20081102',40);
INSERT INTO movimientos (MOV_ID, OFI_ID, MOV_FECHA,ENT_ID) VALUES
(3, 1, '20081103',41);
INSERT INTO movimientos (MOV_ID, OFI_ID, MOV_FECHA,ENT_ID) VALUES
(4, 2, '20081104',41);
INSERT INTO movimientos (MOV_ID, OFI_ID, MOV_FECHA,ENT_ID) VALUES
(5, 2, '20081105',42);
INSERT INTO movimientos (MOV_ID, OFI_ID, MOV_FECHA,ENT_ID) VALUES
(6, 1, '20081106',42);


yo quiero saber en que últimos movimientos está involucrada la oficina 1
la salida debería ser
ENT_ID-FECHA----OFI_ID MOV_ID
42------20081106--1-----6

y para la oficina 2

ENT_ID--FECHA---OFI_ID MOV_ID
40------20081102--2-----2
41------20081104--2-----4

:confused:-- mi problema es que no puedo mostrar todos los campos que deseo, si hago
SELECT M.ENT_ID, max(M.MOV_FECHA) FECHA FROM MOVIMIENTOS M GROUP BY m.ENT_ID;

obtengo
ENT_ID-----FECHA
40---------20081102
41---------20081104
42---------20081106

esto está correcto, pero necesito poder ver tambien la oficina y me dá error cuando le agrego el campo OFI_ID

SELECT M.ENT_ID, max(M.MOV_FECHA) FECHA, M.OFI_ID FROM MOVIMIENTOS M GROUP BY m.ENT_ID;

si agrego el campo tambien en el GROUP BY anda pero no es la consulta que yo quiero ya que me devuleve todo
SELECT M.ENT_ID, max(M.MOV_FECHA) FECHA, M.OFI_ID FROM MOVIMIENTOS M GROUP BY m.ENT_ID, M.OFI_ID;

gracias de antemano

RolphyReyes 04-11-2008 18:33:23

Idea
 
Saludos.

Antes que nada trata de utilizar las etiquetas del foro para poner el código más legible (elegante).

Podrías utilizar DESC en el Order By .

Código SQL [-]
SELECT M.ENT_ID, M.MOV_FECHA, M.OFI_ID 
 FROM MOVIMIENTOS M   
ORDER BY M.MOV_FECHA DESC
GROUP BY m.ENT_ID

Y en caso de que quieras limitar la cantidad de registros sería
Código SQL [-]
SELECT M.ENT_ID, M.MOV_FECHA, M.OFI_ID 
 FROM MOVIMIENTOS M   
ORDER BY M.MOV_FECHA DESC
GROUP BY m.ENT_ID
ROWS XXX

Espero te sirva de algo.

celades1 04-11-2008 18:38:42

Hola

Esto es un truco pero funciona

Te enseñarar los ultimos movimientos fecha e id de movimiento de cada una de las oficinas

Puede haber error de sintaxis, pero la idea es buscar un max de una select que es otro max y que esta ligada a la consulta madre

Código SQL [-]
SELECT M.OFI_ID, max(M.MOV_FECHA) FECHA, 
max((select max(m1.ENT_ID) FROM MOVIMIENTOS M1
where m1.OFI_ID=M.OFI_ID AND M1.MOV_FECHA=M.MOV_FECHA)) MOV_ID
FROM MOVIMIENTOS M 
GROUP BY  M.OFI_ID

Saludos

fcios 04-11-2008 21:53:38

gracias RolphyReyes pero da error.

gracias celades1 por ahí debe andar la cosa voy a seguir probando

fcios 05-11-2008 05:11:27

:) Muchas gracias a todos, consulta terminada :)

SELECT MOVIMIENTOS.MOV_ID, MOVIMIENTOS.OFI_ID, MOVIMIENTOS.MOV_FECHA, MOVIMIENTOS.ENT_ID
FROM MOVIMIENTOS INNER JOIN
(SELECT M.ENT_ID, Max(M.MOV_FECHA) AS MaxDeMOV_FECHA
FROM MOVIMIENTOS AS M
GROUP BY M.ENT_ID) Subconsulta

ON (MOVIMIENTOS.MOV_FECHA = Subconsulta.MaxDeMOV_FECHA) AND (MOVIMIENTOS.ENT_ID = Subconsulta.ENT_ID)

where ofi_id = 1

y si la quiero relacionar con otras tablas para obtener mas datos me quedó

SELECT M1.MOV_ID, M1.OFI_ID, M1.MOV_FECHA, M1.ENT_ID , E.ENT_NUMERO, E.ENT_ANIO, E.TEM_ID, T.TEM_DESCRI
FROM MOVIMIENTOS M1 INNER JOIN
(SELECT M.ENT_ID, Max(M.MOV_FECHA) AS MaxDeMOV_FECHA
FROM MOVIMIENTOS M
GROUP BY M.ENT_ID) Subconsulta

ON (M1.MOV_FECHA = Subconsulta.MaxDeMOV_FECHA) AND (M1.ENT_ID = Subconsulta.ENT_ID)

INNER JOIN ENTRADAS E ON M1.ENT_ID = E.ENT_ID
INNER JOIN TEMAS T ON E.TEM_ID = T.TEM_ID

where ofi_id = 1


La franja horaria es GMT +2. Ahora son las 02:39:20.

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