Newsgrupos.com  

Retroceder   Newsgrupos.com > Forum > Newsgroup microsoft.public.es.* 1 Foro > Newsgroup microsoft.public.es.sqlserver
Registrarse Preguntas Frecuentes Lista de Foreros Calendario Buscar Temas de Hoy Marcar Foros Como Leídos




Respuesta
 
LinkBack Herramientas Desplegado
  #1 (permalink)  
Antiguo 11-03-2008, 12:53:03
Penta
 
Mensajes: n/a
Predeterminado Como seleccionar estos registros ??

Estimados.
Utilizo SQL SERVER 2000 SP4

Tengo una tabla, que tiene lo siguiente:

codigo nivel cantidad

Primer caso:

codigo nivel cantidad
1 1 2
1 3 3
1 8 5

Necesito quedarme con el 3er registro que es el que tiene una mayor
numero en el campo cantidad. por otro lado, y este es el 2do caso:

codigo nivel cantidad
2 1 3
2 3 3

Aca necesito quedarme con el primer registro, ya que tienen la misma
cantidad pero el nivel que deseo debe ser el menor.

Ojala pudiesen ayudarme y si es posible hacerlo en una misma consulta.

Siempre agradecido del foro.
Penta.

Responder Con Cita
Alt Today
Advertising
Google Adsense
 
This advertising will not be shown
in this way to registered members.
Register your free account today
and become a member on
Newsgrupos.com
Standard Sponsored Links

  #2 (permalink)  
Antiguo 11-03-2008, 13:26:00
Gux (MVP)
 
Mensajes: n/a
Predeterminado RE: Como seleccionar estos registros ??

Si estos son los datos, con cuál registro usted se quedarÃ***a?

codigo nivel cantidad
1 1 2
1 3 3
1 8 5
1 7 6



--
Gustavo Larriera, Microsoft MVP
https://mvp.support.microsoft.com/profile/gux
--
Este mensaje se proporciona tal como es, sin garantÃ***as de ninguna clase.



"Penta" wrote:

> Estimados.
> Utilizo SQL SERVER 2000 SP4
>
> Tengo una tabla, que tiene lo siguiente:
>
> codigo nivel cantidad
>
> Primer caso:
>
> codigo nivel cantidad
> 1 1 2
> 1 3 3
> 1 8 5
>
> Necesito quedarme con el 3er registro que es el que tiene una mayor
> numero en el campo cantidad. por otro lado, y este es el 2do caso:
>
> codigo nivel cantidad
> 2 1 3
> 2 3 3
>
> Aca necesito quedarme con el primer registro, ya que tienen la misma
> cantidad pero el nivel que deseo debe ser el menor.
>
> Ojala pudiesen ayudarme y si es posible hacerlo en una misma consulta.
>
> Siempre agradecido del foro.
> Penta.
>
>

Responder Con Cita
  #3 (permalink)  
Antiguo 11-03-2008, 13:30:00
Alejandro Mesa
 
Mensajes: n/a
Predeterminado RE: Como seleccionar estos registros ??

Penta,

Trata:

select *
from t1 as a
where
not exists (
select *
from t1 as b
where
b.codigo = a.codigo
and
(
b.cantidad > a.cantidad
or
(
b.cantidad = a.cantidad
and b.nivel < a.nivel
)
)
)
go

AMB

"Penta" wrote:

> Estimados.
> Utilizo SQL SERVER 2000 SP4
>
> Tengo una tabla, que tiene lo siguiente:
>
> codigo nivel cantidad
>
> Primer caso:
>
> codigo nivel cantidad
> 1 1 2
> 1 3 3
> 1 8 5
>
> Necesito quedarme con el 3er registro que es el que tiene una mayor
> numero en el campo cantidad. por otro lado, y este es el 2do caso:
>
> codigo nivel cantidad
> 2 1 3
> 2 3 3
>
> Aca necesito quedarme con el primer registro, ya que tienen la misma
> cantidad pero el nivel que deseo debe ser el menor.
>
> Ojala pudiesen ayudarme y si es posible hacerlo en una misma consulta.
>
> Siempre agradecido del foro.
> Penta.
>
>

Responder Con Cita
  #4 (permalink)  
Antiguo 11-03-2008, 13:33:01
Alejandro Mesa
 
Mensajes: n/a
Predeterminado RE: Como seleccionar estos registros ??

-- 2005
;with cte
as
(
select
codigo, nivel, cantidad,
row_number() over(partition by codigo order by cantidad DESC, nivel ASC)
as rn
from t1
)
select codigo, nivel, cantidad
from cte
where rn = 1
go


AMB


"Alejandro Mesa" wrote:

> Penta,
>
> Trata:
>
> select *
> from t1 as a
> where
> not exists (
> select *
> from t1 as b
> where
> b.codigo = a.codigo
> and
> (
> b.cantidad > a.cantidad
> or
> (
> b.cantidad = a.cantidad
> and b.nivel < a.nivel
> )
> )
> )
> go
>
> AMB
>
> "Penta" wrote:
>
> > Estimados.
> > Utilizo SQL SERVER 2000 SP4
> >
> > Tengo una tabla, que tiene lo siguiente:
> >
> > codigo nivel cantidad
> >
> > Primer caso:
> >
> > codigo nivel cantidad
> > 1 1 2
> > 1 3 3
> > 1 8 5
> >
> > Necesito quedarme con el 3er registro que es el que tiene una mayor
> > numero en el campo cantidad. por otro lado, y este es el 2do caso:
> >
> > codigo nivel cantidad
> > 2 1 3
> > 2 3 3
> >
> > Aca necesito quedarme con el primer registro, ya que tienen la misma
> > cantidad pero el nivel que deseo debe ser el menor.
> >
> > Ojala pudiesen ayudarme y si es posible hacerlo en una misma consulta.
> >
> > Siempre agradecido del foro.
> > Penta.
> >
> >

Responder Con Cita
  #5 (permalink)  
Antiguo 11-03-2008, 13:39:08
Carlos M. Calvelo
 
Mensajes: n/a
Predeterminado Re: Como seleccionar estos registros ??

Hola Penta,


On 11 mrt, 13:53, Penta <cristian...***gmail.com> wrote:
> Estimados.
> Utilizo SQL SERVER 2000 SP4
>
> Tengo una tabla, que tiene lo siguiente:
>
> codigo nivel cantidad
>
> Primer caso:
>
> codigo nivel cantidad
> 1 *** *** *** *** ***1 *** *** *** ***2
> 1 *** *** *** *** ***3 *** *** *** ***3
> 1 *** *** *** *** ***8 *** *** *** ***5
>
> Necesito quedarme con el 3er registro que es el que tiene una mayor
> numero en el campo cantidad. por otro lado, y este es el 2do caso:
>
> codigo nivel cantidad
> 2 *** *** *** *** ***1 *** *** *** ***3
> 2 *** *** *** *** ***3 *** *** *** ***3
>
> Aca necesito quedarme con el primer registro, ya que tienen la misma
> cantidad pero el nivel que deseo debe ser el menor.
>
> Ojala pudiesen ayudarme y si es posible hacerlo en una misma consulta.
>
> Siempre agradecido del foro.
> Penta.



Entiendo que quieres agrupar el resultado por codigo y que
para cada codigo quieres el registro con la mayor cantidad
y dentro de esa cantidad el menor nivel.


Digamos que tu tabla se llama tx.


select *
from tx t1
where t1.cantidad = (select max(cantidad)
from tx
where codigo=t1.codigo)
and
t1.nivel = (select min(nivel)
from tx
where codigo=t1.codigo and
cantidad = (select max(cantidad)
from tx
where codigo=t1.codigo))


O así:

select t1.codigo,
(select min(nivel)
from tx
where codigo=t1.codigo and
cantidad = (select max(cantidad)
from tx
where codigo=t1.codigo)) as nivel,
max(t1.cantidad) as cantidad
from tx t1
group by t1.codigo

Saludos,
Carlos
Responder Con Cita
  #6 (permalink)  
Antiguo 11-03-2008, 13:42:11
jcac
 
Mensajes: n/a
Predeterminado Re: Como seleccionar estos registros ??

Hola Penta

Espero esto te ayude:

create table #tmp(codigo int, nivel int, cantidad int)
go
insert into #tmp values (1, 1, 2)
insert into #tmp values (1, 3, 3)
insert into #tmp values (1, 8, 5)
insert into #tmp values (2, 1, 3)
insert into #tmp values (2, 3, 3)
go
select t.codigo, (select min(nivel) from #tmp where t.codigo = codigo and
max(t.cantidad) = cantidad) as nivel, max(t.cantidad) as cantidad
from #tmp t
group by t.codigo
go
select * from #tmp
go
drop table #tmp
go

Saludos

Juan Carlos
"Penta" <cristian.pm***gmail.com> escribió en el mensaje
news:3dbf40cc-a269-4dc4-a91e-3d563f660ea1***o77g2000hsf.googlegroups.com...
> Estimados.
> Utilizo SQL SERVER 2000 SP4
>
> Tengo una tabla, que tiene lo siguiente:
>
> codigo nivel cantidad
>
> Primer caso:
>
> codigo nivel cantidad
> 1 1 2
> 1 3 3
> 1 8 5
>
> Necesito quedarme con el 3er registro que es el que tiene una mayor
> numero en el campo cantidad. por otro lado, y este es el 2do caso:
>
> codigo nivel cantidad
> 2 1 3
> 2 3 3
>
> Aca necesito quedarme con el primer registro, ya que tienen la misma
> cantidad pero el nivel que deseo debe ser el menor.
>
> Ojala pudiesen ayudarme y si es posible hacerlo en una misma consulta.
>
> Siempre agradecido del foro.
> Penta.
>



Responder Con Cita
  #7 (permalink)  
Antiguo 11-03-2008, 14:36:40
Penta
 
Mensajes: n/a
Predeterminado Re: Como seleccionar estos registros ??

Una enesima vez: SE PASARON !!!!!
Ambas qrys obtienen los mismos resultados y se agradece.

Por ultimo si no es mucha la molestia, me gustaria entender las
consultas para poder aplicar similar logica a futuras situaciones.

--Alejandro Mesa
De que forma esta query obtiene el max de un determinado registro ??
select *
from #temp2 as a
where
not exists (
select *
from #temp2 as b
where
b.codigo = a.codigo
and
(
b.cantidad > a.cantidad
or
(
b.cantidad = a.cantidad
and b.nivel < a.nivel
)
)
)
--------------------------------------------------------------------
Carlos M. Calvelo y jcac
Entiendo como sacan el min de nivel cuando codigo y max de cantidad
son iguales.
Y creo entender en el "as cantidad" sacan el max del registro
simpelmente lo cual esta bien.
La pregunta que tengo es un tanto compleja y es:
De que forma me puedo formar la logica de este tipo de consulta.

select t.codigo , (select min(nivel) from #temp2 where t.codigo =
codigo and
max(t.cantidad) = cantidad) as nivel, max(t.cantidad) as cantidad
from #temp2 t
group by t.codigo

Mil Gracias.
Penta.
Responder Con Cita
  #8 (permalink)  
Antiguo 11-03-2008, 15:13:03
Alejandro Mesa
 
Mensajes: n/a
Predeterminado Re: Como seleccionar estos registros ??

Penta,

Este query selecciona todas las filas de la tabla [t1], para las cuales no
existe otra fila en la misma tabla, que tenga el mismo codigo y que a su vez
tenga un valor en la columna [cantidad] mayor al valor de la misma columna de
la fila corriente o que el valor de la cantidad es igual pero el nivel no es
menor al nivel de la fila corriente. En otras palabras, la fila para ese
codigo con mayor valor en la columna cantidad o en caso de empate, mayor
valor y menor nivel.

Si usas SQL Server 2005, te recomiendo uses la version que usa la funcion
ROW_NUMBER. Esta version suele tener mejor desempenio.


AMB

"Penta" wrote:

> Una enesima vez: SE PASARON !!!!!
> Ambas qrys obtienen los mismos resultados y se agradece.
>
> Por ultimo si no es mucha la molestia, me gustaria entender las
> consultas para poder aplicar similar logica a futuras situaciones.
>
> --Alejandro Mesa
> De que forma esta query obtiene el max de un determinado registro ??
> select *
> from #temp2 as a
> where
> not exists (
> select *
> from #temp2 as b
> where
> b.codigo = a.codigo
> and
> (
> b.cantidad > a.cantidad
> or
> (
> b.cantidad = a.cantidad
> and b.nivel < a.nivel
> )
> )
> )
> --------------------------------------------------------------------
> Carlos M. Calvelo y jcac
> Entiendo como sacan el min de nivel cuando codigo y max de cantidad
> son iguales.
> Y creo entender en el "as cantidad" sacan el max del registro
> simpelmente lo cual esta bien.
> La pregunta que tengo es un tanto compleja y es:
> De que forma me puedo formar la logica de este tipo de consulta.
>
> select t.codigo , (select min(nivel) from #temp2 where t.codigo =
> codigo and
> max(t.cantidad) = cantidad) as nivel, max(t.cantidad) as cantidad
> from #temp2 t
> group by t.codigo
>
> Mil Gracias.
> Penta.
>

Responder Con Cita
  #9 (permalink)  
Antiguo 11-03-2008, 16:49:07
jcac
 
Mensajes: n/a
Predeterminado Re: Como seleccionar estos registros ??

Hola Penta,

Las consultas por ejemplo en mi caso las voy armando por partes, entonces,
segúnt u caso:

1. Deseas los maximos por cada codigo de la columan cantidad, entonces
primero consiguo eso:

select t.codigo, max(t.cantidad) from #tmp t group by t.codigo

hasta aqui esto
2. luego necesito obtener cual es su valor minimo de la columna nivel,
entonces ese lo consiguo con una subconsulta y obtengo el resultado final,
en la subconsulta la evaluo por t.codigo y max(t.cantidad) ya que esos son
los datos que ya filtre y obtengo:

select t.codigo,
(select min(nivel) from #tmp where t.codigo = codigo and max(t.cantidad) =
cantidad) as nivel, --- subconsulta
max(t.cantidad) as cantidad
from #tmp t
group by t.codigo

ahora como un punto aparte prove los planes de ejecución de las consultas de
todos y la que tiene mejor resultado es la de Alejandro.

Saludos

Juan Carlos


"Penta" <cristian.pm***gmail.com> escribió en el mensaje
news:1f99ef9a-53ec-4276-aa5a-68e561d546ba***13g2000hsb.googlegroups.com...
> Una enesima vez: SE PASARON !!!!!
> Ambas qrys obtienen los mismos resultados y se agradece.
>
> Por ultimo si no es mucha la molestia, me gustaria entender las
> consultas para poder aplicar similar logica a futuras situaciones.
>
> --Alejandro Mesa
> De que forma esta query obtiene el max de un determinado registro ??
> select *
> from #temp2 as a
> where
> not exists (
> select *
> from #temp2 as b
> where
> b.codigo = a.codigo
> and
> (
> b.cantidad > a.cantidad
> or
> (
> b.cantidad = a.cantidad
> and b.nivel < a.nivel
> )
> )
> )
> --------------------------------------------------------------------
> Carlos M. Calvelo y jcac
> Entiendo como sacan el min de nivel cuando codigo y max de cantidad
> son iguales.
> Y creo entender en el "as cantidad" sacan el max del registro
> simpelmente lo cual esta bien.
> La pregunta que tengo es un tanto compleja y es:
> De que forma me puedo formar la logica de este tipo de consulta.
>
> select t.codigo , (select min(nivel) from #temp2 where t.codigo =
> codigo and
> max(t.cantidad) = cantidad) as nivel, max(t.cantidad) as cantidad
> from #temp2 t
> group by t.codigo
>
> Mil Gracias.
> Penta.



Responder Con Cita
  #10 (permalink)  
Antiguo 11-03-2008, 17:04:25
Penta
 
Mensajes: n/a
Predeterminado Re: Como seleccionar estos registros ??

Sensacional, lo malo es que no logro "ver" de forma clara la consulta
de Alejandro, que obviamente esta perfecta, pero me cuesta mas
entender la logica , pero bueno eso es un "desperfecto" en mi
cerebro

Gracias TOTALES

Penta.
Responder Con Cita
 
Respuesta


Herramientas
Desplegado

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
Trackbacks are habilitado
Pingbacks are habilitado
Refbacks are habilitado


Temas Similares
Tema Autor Foro Respuestas Último mensaje
Re: como eliminar el punteado al seleccionar Daniel Martín [MVP Windows] Newsgroup microsoft.public.es.windowsvista 15 12-08-2008 02:00:50
Como seleccionar bandejas Santa Fe Newsgroup microsoft.public.es.windowsxp.hardware 2 08-05-2007 23:52:01
Seleccionar Registros en funcion de un campo trd_tomas@telefonica.net Newsgroup es.comp.lenguajes.delphi 6 11-10-2006 11:47:08
Re: Seleccionar registros aleatorios en una Tabla Carlos Alloatti Newsgroup microsoft.public.es.vfoxpro.datos 0 28-03-2006 18:19:02
Seleccionar registros aleatorios en una Tabla Daniel Newsgroup microsoft.public.es.vfoxpro.datos 2 28-03-2006 18:19:02





Powered by: vBulletin, Versión 3.6.8
Derechos de Autor ©2000 - 2009, Jelsoft Enterprises Ltd.

LinkBacks Enabled by vBSEO 3.1.0 © 2007, Crawlability, Inc.