![]() |
| |||||||
| Registrarse | Preguntas Frecuentes | Lista de Foreros | Calendario | Buscar | Temas de Hoy | Marcar Foros Como Leídos |
![]() |
| | LinkBack | Herramientas | Desplegado |
| |||
| 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. |
| | ||||
| ||||
| |
| |||
| 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. > > |
| |||
| 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. > > |
| |||
| -- 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. > > > > |
| |||
| 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 |
| |||
| 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. > |
| |||
| 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. |
| |||
| 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. > |
| |||
| 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. |
| |||
| 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 micerebro ![]() Gracias TOTALES Penta. |
| |
| |
![]() |
| Herramientas | |
| Desplegado | |
| |
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 |