Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   SQL (https://www.clubdelphi.com/foros/forumdisplay.php?f=6)
-   -   un Order by Personalizado (https://www.clubdelphi.com/foros/showthread.php?t=79174)

AL3XZ4ND3R 13-06-2012 16:36:48

un Order by Personalizado
 
Tengo una [Tabla] con lo siguientes campos:

Id | Fecha | Hora | UserName | ...y mas campos.

Necesito ordenar la tabla de acuerdo al UserName que mas se repita, es decir;

puedo contar los registros de la siguiente manera:

Código SQL [-]
Select UserName, Count(*) as Contador from Tabla
group by UserName
Order by Contador DESC

... este es el orden que quiero que tenga la tabla, pero ¿cómo hago una consulta que me devuelva todos los registros de la tabla en este orden?; ya que necesito hacer uso de los demás campos de la tabla.

ejemplo:

Id|Fecha|Hora|UserName|...etc
1 x x jherrera
2 x x jherrera
3 x x jherrera
4 x x hmendez
5 x x hmendez
6 x x srodriguez

Gracias.

Chris 13-06-2012 17:01:23

Que servidor de base de datos está utilizando?

Caro 13-06-2012 17:25:27

Hola AL3XZ4ND3R, tendría que ser algo así:

Código SQL [-]
Select t1.Id, t1.Fecha, t1.Hora, t1.UserName
From Tabla t1 Left Join (Select UserName, Count(*) as Contador
                         From Tabla
                         Group By UserName) t2
     On (t1.UserName=t2.UserName)
Order by Contador Desc

Saluditos

roman 13-06-2012 18:08:05

Hola Caro,

En la consulta que pones, ¿no habría que añadir la columna contador en la lista del select exterior?

// Saludos

Caro 13-06-2012 18:26:07

Cita:

Empezado por roman (Mensaje 434996)
En la consulta que pones, ¿no habría que añadir la columna contador en la lista del select exterior?

Hola Roman, Contador solo lo utilizaríamos para hacer el ordenamiento, es por eso que no sería necesario colocarlo en el Select exterior, pero si necesita ver el valor de contador, no habría problema de añadirlo.

Saluditos

ElDioni 13-06-2012 18:48:34

Hola Caro,

porque no recorres el select que te da el orden de los usuarios y vas metiendo el user en una variable string.

Código Delphi [-]
while QueryOrden.eof=false do
  begin
    if ordenados='' then ordenados:=queryorden.fieldbyname('user').asstring
      else ordenados:=ordenados+','+queryorden.fieldbyname('user').asstring;
    QueryOrden.Next;
  end;
QueryOtro.Close;
QueryOtro.SQL.Text:='SELECT * FROM tabla ORDER BY '+ordenados;
QueryOtro.Open;

Saludos

AL3XZ4ND3R 13-06-2012 19:14:03

Gracias
 
Excelente, la respuesta de Caro es la que mas se ajusta mis necesidades.

Muchas Gracias, al final tuve que agregar parámetros para que la consulta se realice en un rango de fecha.

quedó así:

Código SQL [-]
Select t1.* from Tabla t1
Left Join (Select Username, Count(*) as Contador
                         From Tabla
                         where (Fecha between (:FechaIni) and (:FechaFin)) and Status='D'
                         Group By Username) t2
                         on (t1.Username= t2.Username)
where (Fecha between (:FechaIni) and (:FechaFin)) and Status='D'
Order by t1.AgenciaId,Contador Desc

el resultado es el que necesito y ya lo estoy usando así, pero no sé si con más registros mi consulta se haga demasiado lenta, en tal caso me pregunto si la respuesta de "ELDioni" agilice la consulta o es igual.

Al González 13-06-2012 22:46:03

Creo que se te pasó responder a la pregunta del compañero Chris (mensajes más arriba). :)
Cita:

Empezado por Chris (Mensaje 434990)
Que servidor de base de datos está utilizando?


AL3XZ4ND3R 14-06-2012 19:00:06

Cita:

Empezado por Chris (Mensaje 434990)
Que servidor de base de datos está utilizando?

Disculpas, firebird.


La franja horaria es GMT +2. Ahora son las 22:59:31.

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