Máximo y el siguiente de un grupo en una tabla de SQL

Hola Expertos!
Les dejo una duda que tengo:
Tengo una tabla Clientes con dos columnas: cliente e importe
Necesito una consulta que me retorne el máximo importe y su siguiente de cada cliente. Un ejemplo seria:

Cliente Importe
Pedro 124
Pedro 12
Juan 5
Juan 2
Les doy mi código para que lo revisen
select (select top 2 cliente,importe from clientes c2 where c1.cliente=c2.cliente)
from clientes c1

Espero su corrección.
Gracias!
damimg

1 Respuesta

Respuesta
1
En primer lugar en sqlserver, una subconsulta no puede devolver más de un campo, lo que quiere decir que lo que intentas hacer con "select top 2 cliente, importe ..." esta errado y no es posible hacerlo.
Ahora bien el tipo de consulta que quieres, no digo que no sea posible hacerla pero si creo que no es posible obtenerla con solo un query, la lógica de lo que quieres no es sencilla y deberás romperte un poco el coco para sacarla, yo optaría por realizar esto con un lenguaje de programación el cual tiene más posibilidades para realizar operaciones tan complejas.
¿Experto y me podrías decir como seria el código en sql?
¿Una subconsulta colocada en el select externo siempre tiene que devolver un único dato o hay excepciones?
Gracias!
damimg
Como ya te lo dije en SQL seria algo muy engorroso de hacer, te sugiero nuevamente que utilices un lenguaje de programación más indicado para este tipo de tareas como puede ser VB o C#.
Siempre que utilices una subconsulta como resultado para un campo la subconsulta debe devolver solo un valor.
Hola Yescuder, tu dices que un subselect siempre tiene que devolver un único valor, ¿es siempre así eso? ¿Y en el caso que el subselect figure luego de un from? Me gustaría que me des ejemplos de cada caso particular así me queda más claro.
Todas las columnas que figuran en el select principal deben tambien figurar en el group by o hay excepeciones?
¿El order by puede admitir funciones de grupo como max() o avg()?
Espero tu ayuda.
Gracias!
damimg
Ejemplos:
SELECT id, nombre, (Select ... este select solo debe devolver un valor) as Campo1 
FROM clientes as C, (Select Campo1, campo2,... este select puede devolver los campos que quieras pues en este caso esta haciendo las veces de tabla)
WHERE id in (Select .... solo debe devolver un campo)
WHERE id exists (Select... puede devolver varios campos).
Todas las columnas que no sean un agrupado deben estar en el group by. Ej:
Select Campo1, Campo2, CampoX..., Count(1)  as Num, Sum(1) as Suma, ....  FROM tabla1 GROUP BY Campo1, Campo2, CampoX...
Finalmente el "order by" admite expresiones de ese tipo como columna, es decir :
Select... From.... Order By Avg(Campo1) ASC, esta consulta mostraria los registro de menor a mayor promedio.

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas