Foros del Web » Programación para mayores de 30 ;) » Bases de Datos General » SQL Server »

max con where

Estas en el tema de max con where en el foro de SQL Server en Foros del Web. Hola, tengo que hacer una consulta sencilla a la BD y la verdad que me encontre con un problema con el max. La consulta en ...
  #1 (permalink)  
Antiguo 21/01/2010, 09:49
 
Fecha de Ingreso: mayo-2004
Mensajes: 189
Antigüedad: 20 años
Puntos: 1
max con where

Hola, tengo que hacer una consulta sencilla a la BD y la verdad que me encontre con un problema con el max.
La consulta en si es

Código:
SELECT MAX(id), saldo FROM CAJA WHERE idSucursal = 1 GROUP BY saldo
Pero no me devuelve un solo registro, me devuelve todos los registros de la sucursal 1 (la que puse en el WHERE)

¿Como deberia hacer para que solo me devuelva el registro con mas alto id de determinada sucursal?

Agradecere cualquier aporte.

Saludos
__________________
Nadie nacío sabiendo...
  #2 (permalink)  
Antiguo 21/01/2010, 10:36
Avatar de flaviovich  
Fecha de Ingreso: agosto-2005
Ubicación: Lima, Peru
Mensajes: 2.951
Antigüedad: 18 años, 8 meses
Puntos: 39
Respuesta: max con where

No sería poner MAX(idSucursal)?
__________________
No repitamos temas, usemos el Motor de busquedas
Plantea bien tu problema: Ayúdanos a ayudarte.
  #3 (permalink)  
Antiguo 21/01/2010, 10:43
Avatar de iislas
Colaborador
 
Fecha de Ingreso: julio-2007
Ubicación: Mexico, D.F.
Mensajes: 6.482
Antigüedad: 16 años, 9 meses
Puntos: 180
Respuesta: max con where

mmmmm, no me suena, porque el WHERE es el que manda, digo yo

En todo caso, seria al MAX(SALDO).

Aunque SANREF, ¿Que maximo deseas obtener?
  #4 (permalink)  
Antiguo 21/01/2010, 10:51
 
Fecha de Ingreso: mayo-2004
Mensajes: 189
Antigüedad: 20 años
Puntos: 1
Respuesta: max con where

Con MAX(idSucursal) me da igual resultado, ademas el idSucursal lo paso como parametro.

Lo que necesito obtener es el saldo de caja de una sucursal determinada. Tengo una tabla CAJA donde tengo los datos de la caja y ademas un campo idSucursal (que me separa las cajas individuales de cada sucursal) y un campo saldo que me da el saldo actual de cada sucursal, lo que necesito obtener es el saldo actual de cada sucursal, por eso busco el ultimo MAX(id) de los resultados filtrados por idSucursal, que seria el ultimo registro realizado a una determinada sucursal, ¿se entiende?

Lo solucione de esta forma, pero creo que puede haber una mejor (donde el MAX no te traiga muchos registros). El ejemplo es para la sucursal con ID = 1

Código:
SELECT saldo FROM CAJA WHERE id = (SELECT max(id) as id  FROM CAJA WHERE idSucursal  = 1)
__________________
Nadie nacío sabiendo...
  #5 (permalink)  
Antiguo 21/01/2010, 11:15
Avatar de iislas
Colaborador
 
Fecha de Ingreso: julio-2007
Ubicación: Mexico, D.F.
Mensajes: 6.482
Antigüedad: 16 años, 9 meses
Puntos: 180
Respuesta: max con where

/* SELECT SUCURSAL, CAJA, SUM (SALDO) FROM CAJA GROUP BY SUCURSAL, CAJA */

Eso te daria el TOTOL de la suma de SALDO, agrupado por SUCURSAL y CAJA

¿Para que el MAX?
  #6 (permalink)  
Antiguo 21/01/2010, 11:20
Avatar de flaviovich  
Fecha de Ingreso: agosto-2005
Ubicación: Lima, Peru
Mensajes: 2.951
Antigüedad: 18 años, 8 meses
Puntos: 39
Respuesta: max con where

Prueba asi:
Código SQL:
Ver original
  1. SELECT C.id, C.saldo
  2. FROM CAJA C
  3. INNER JOIN (
  4.     SELECT MAX(id) id
  5.     FROM CAJA
  6.     WHERE idSucursal = 1
  7. ) T ON C.id = T.id
__________________
No repitamos temas, usemos el Motor de busquedas
Plantea bien tu problema: Ayúdanos a ayudarte.
  #7 (permalink)  
Antiguo 21/01/2010, 11:21
 
Fecha de Ingreso: mayo-2004
Mensajes: 189
Antigüedad: 20 años
Puntos: 1
Respuesta: max con where

no, es que el saldo se calcula y se guarda en la Base de Datos una vez que se registra una entrada a la tabla CAJA.
Parece incongruente hacer esto si podes hacer, como decis, un SUM; pero ha varias cosas por lo que hago esto:
- la caja tiene entradas y salidas, o sea que un SUM no me sirve porque dependiendo de esto debo sumar o restar para obtener el saldo
- si la tabla tiene muchos registros, un SUM tardaria cada dia mas en hacerce (por que todos los dias hay mas registros)

Por eso calculo y registro el saldo en cada registro de la tabla, y por eso quiero recuperarlo...
__________________
Nadie nacío sabiendo...
  #8 (permalink)  
Antiguo 21/01/2010, 11:27
Avatar de iislas
Colaborador
 
Fecha de Ingreso: julio-2007
Ubicación: Mexico, D.F.
Mensajes: 6.482
Antigüedad: 16 años, 9 meses
Puntos: 180
Respuesta: max con where

Pues es un muy mala estrategia, tener los SALDOS en tu tabla de MOVIMIENTOS.

Deberia ser en OTRA TABLA diferente.

Ademas, asi fueran MILLONES de registros, si estan bien especificados los INDICES, no debe tardar, el tipo de registro, no es problema, podrias utilizar CASE para definir si SUMAS o RESTAS.
  #9 (permalink)  
Antiguo 21/01/2010, 11:41
 
Fecha de Ingreso: mayo-2004
Mensajes: 189
Antigüedad: 20 años
Puntos: 1
Respuesta: max con where

Cita:
Iniciado por iislas Ver Mensaje
Pues es un muy mala estrategia, tener los SALDOS en tu tabla de MOVIMIENTOS.

Deberia ser en OTRA TABLA diferente.

Ademas, asi fueran MILLONES de registros, si estan bien especificados los INDICES, no debe tardar, el tipo de registro, no es problema, podrias utilizar CASE para definir si SUMAS o RESTAS.
Puede ser, es tu punto de vista. Utilizar otra tabla no me parece buena estrategia, ademas asi puede seguir perfectamente los movimientos y volver al saldo original en el caso de alguna equivocacion. Pero bueno, hay miles de formas (efectivas digo) de hacer las cosas, respeto todas y escogo la que me parece "mas" efectiva. Podria ser un buen tema de discusion.

flaviovich, mas o menos hice eso, gracias!!
__________________
Nadie nacío sabiendo...
  #10 (permalink)  
Antiguo 21/01/2010, 15:04
Avatar de iislas
Colaborador
 
Fecha de Ingreso: julio-2007
Ubicación: Mexico, D.F.
Mensajes: 6.482
Antigüedad: 16 años, 9 meses
Puntos: 180
Respuesta: max con where

Si, cada uno escoge la forma de hacer las cosas, algunas son buenas otras excelentes, en fin, al cliente lo que pida....

Etiquetas: max
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 08:26.