Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Bases de datos > MS SQL Server
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 02-11-2022
giantonti1801 giantonti1801 is offline
Miembro
 
Registrado: oct 2022
Posts: 143
Poder: 2
giantonti1801 Va por buen camino
El primer registro de tabla sql

hola foro, tengo una tabla con un campo numero que se incrementa automaticamente a esta misma tabla tengo un campo de condicion 'NEW' o 'OLD' ahora bien quiero que sql recorra la tabla busque todo lo que tengan la condicion 'NEW' y me lo ordene por numero, es decir quiero ver solo el primer registro que tiene el numero mas antiguo:
Ejemplo

10 xxxx xxxxx xxxx xxxx Activo xxx xxxx
6 xxxx xxxxx xxxx xxxx Activo xxx xxxx
11 xxxx xxxxx xxxx xxxx Activo xxx xxxx
7 xxxx xxxxx xxxx xxxx Activo xxx xxxx


si yo realizo la consulta me trae me debería traer el numero 6 (Registro mas Antiguo dentro de la tabla) pero por algo que talvez estoy obviando me esta trayendo e el numero 7

Código SQL [-]
SELECT TOP 1 * FROM tiket where Estatus = 'NEW' order by numero desc

Si alguien tiene alguna idea que como realizar esta consulta se lo agradeceria
Responder Con Cita
  #2  
Antiguo 02-11-2022
Avatar de mamcx
mamcx mamcx is offline
Moderador
 
Registrado: sep 2004
Ubicación: Medellín - Colombia
Posts: 3.911
Poder: 25
mamcx Tiene un aura espectacularmamcx Tiene un aura espectacularmamcx Tiene un aura espectacular
La clausula TOP sirver para, de 100 registros, devolver solo los primeros N *que cumplan la condición*.

Esta NO "analiza" los resultados.


---

Si tienes un SQL Server relativamente nuevo la forma mas simple es con una clausula window, tipo:

https://stackoverflow.com/questions/...w-from-a-group

Código SQL [-]
SELECT * FROM (
SELECT 
*,
row_number() OVER(PARTITION BY AQUI_UN_CAMPO_AGRUPA ORDER BY order DESC) AS order 

 FROM tiket
)a WHERE  order = 1
__________________
El malabarista.
Responder Con Cita
  #3  
Antiguo 02-11-2022
Avatar de Neftali [Germán.Estévez]
Neftali [Germán.Estévez] Neftali [Germán.Estévez] is offline
[becario]
 
Registrado: jul 2004
Ubicación: Barcelona - España
Posts: 18.275
Poder: 10
Neftali [Germán.Estévez] Es un diamante en brutoNeftali [Germán.Estévez] Es un diamante en brutoNeftali [Germán.Estévez] Es un diamante en bruto
También puedes usar la función MIN, ya que lo que quieres es el mínimo valor del campo NUMERO.
Yo creo que esto te puede funcionar:

Código SQL [-]
SELECT * FROM ticket T INNER JOIN 
(
SELECT MIN(numero) AS MINIMO FROM ticket WHERE status='NEW'
) T2 ON T2.MINIMO=T.numero

Esto busca en la tabla el mínimo valor del campo NUMERO según el WHERE (que debería ser 6) y luego hace la JOIN para traerse el resto de campos de la tabla.

NOTA: Asumo que ese campo NUMERO debe tener un índice, si no es así añádeselo.
__________________
Germán Estévez => Web/Blog
Guía de estilo, Guía alternativa
Utiliza TAG's en tus mensajes.
Contactar con el Clubdelphi

P.D: Más tiempo dedicado a la pregunta=Mejores respuestas.

Última edición por Neftali [Germán.Estévez] fecha: 02-11-2022 a las 08:51:33.
Responder Con Cita
  #4  
Antiguo 02-11-2022
Avatar de duilioisola
[duilioisola] duilioisola is offline
Miembro Premium
 
Registrado: ago 2007
Ubicación: Barcelona, España
Posts: 1.734
Poder: 20
duilioisola Es un diamante en brutoduilioisola Es un diamante en brutoduilioisola Es un diamante en bruto
Cita:
si yo realizo la consulta me trae me debería traer el numero 6 (Registro mas Antiguo dentro de la tabla) pero por algo que talvez estoy obviando me esta trayendo e el numero 7
SELECT TOP 1 * FROM tiket where Estatus = 'NEW' order by numero desc
Creo que el problema es que estás pidiendo el primero, ordenado de forma descendente.

7 <---
6
5
...

La consulta correcta sería:
Código SQL [-]
SELECT TOP 1 * FROM tiket where Estatus = 'NEW' order by numero
Responder Con Cita
  #5  
Antiguo 02-11-2022
giantonti1801 giantonti1801 is offline
Miembro
 
Registrado: oct 2022
Posts: 143
Poder: 2
giantonti1801 Va por buen camino
Cita:
Empezado por Neftali [Germán.Estévez] Ver Mensaje
También puedes usar la función MIN, ya que lo que quieres es el mínimo valor del campo NUMERO.
Yo creo que esto te puede funcionar:

Código SQL [-]
SELECT * FROM ticket T INNER JOIN 
(
SELECT MIN(numero) AS MINIMO FROM ticket WHERE status='NEW'
) T2 ON T2.MINIMO=T.numero

Esto busca en la tabla el mínimo valor del campo NUMERO según el WHERE (que debería ser 6) y luego hace la JOIN para traerse el resto de campos de la tabla.

NOTA: Asumo que ese campo NUMERO debe tener un índice, si no es así añádeselo.
Perfecto! me funciona en Sql Manager sin ningun problema pero ahora me esta dando problema en la aplicacion

Código:
begin
    With ADOQuery1 do
        begin
        Close;
        Sql.Clear;
        Open;
        Sql.Text := 'SELECT * FROM tiket T INNER JOIN (SELECT MIN(Item) AS MINIMO FROM tiket WHERE estatus=NEW') T2 ON T2.MINIMO=T.Item';
        ADOQuery1.First;
        while not ADOQuery1.Eof do
        begin
         Label1.Caption := 'A000' + ADOQuery1.fieldbyname('Item').asstring;
        end;
Responder Con Cita
  #6  
Antiguo 02-11-2022
Avatar de kuan-yiu
[kuan-yiu] kuan-yiu is offline
Miembro Premium
 
Registrado: jun 2006
Ubicación: Galicia. España.
Posts: 1.017
Poder: 19
kuan-yiu Va camino a la fama
Tienes el open antes de cargar la sentencia SQL
Responder Con Cita
  #7  
Antiguo 02-11-2022
giantonti1801 giantonti1801 is offline
Miembro
 
Registrado: oct 2022
Posts: 143
Poder: 2
giantonti1801 Va por buen camino
Cita:
Empezado por kuan-yiu Ver Mensaje
Tienes el open antes de cargar la sentencia SQL
Código:
With ADOQuery1 do
        begin
        Close;
        Sql.Clear;
        Sql.Text := 'SELECT * FROM tiket T INNER JOIN (SELECT MIN(Item) AS MINIMO FROM tiket WHERE estatus =: 'NEW' ;
        Open;
        ADOQuery1.First;

        while not ADOQuery1.Eof do
        begin
         Label1.Caption := 'A000' + ADOQuery1.fieldbyname('Item').asstring;
        end;
No ni siquiera haciendo eso es que el error me lo da justamente es esta linea y no me deja compilarlo para verificar
Responder Con Cita
  #8  
Antiguo 02-11-2022
Avatar de duilioisola
[duilioisola] duilioisola is offline
Miembro Premium
 
Registrado: ago 2007
Ubicación: Barcelona, España
Posts: 1.734
Poder: 20
duilioisola Es un diamante en brutoduilioisola Es un diamante en brutoduilioisola Es un diamante en bruto
Aquí tienes un lío de comillas.
Código Delphi [-]
Sql.Text := 'SELECT * FROM tiket T INNER JOIN (SELECT MIN(Item) AS MINIMO FROM tiket WHERE estatus =: 'NEW' ;
                                                                                                      ^^^^^ ;
                                                                                                   ^^
Debería ser
Código Delphi [-]
Sql.Text := 'SELECT * FROM tiket T INNER JOIN (SELECT MIN(Item) AS MINIMO FROM tiket WHERE estatus =: ''NEW'' ';

Admás no se bien qué es el "estatus =:"
Responder Con Cita
  #9  
Antiguo 02-11-2022
Avatar de kuan-yiu
[kuan-yiu] kuan-yiu is offline
Miembro Premium
 
Registrado: jun 2006
Ubicación: Galicia. España.
Posts: 1.017
Poder: 19
kuan-yiu Va camino a la fama
Como te han indicado, las comillas de 'NEW' están mal.
Yo prefiero usar QuotedStr(miDato), siempre que tengo que poner comillas.
Además '=:' indica que le pasas un parámetro. O bien sobran las comillas de 'NEW' y tienes que indicar el valor de ese parámetro, o bien sobra ':'
Responder Con Cita
  #10  
Antiguo 02-11-2022
giantonti1801 giantonti1801 is offline
Miembro
 
Registrado: oct 2022
Posts: 143
Poder: 2
giantonti1801 Va por buen camino
Cita:
Empezado por duilioisola Ver Mensaje
Aquí tienes un lío de comillas.
Código Delphi [-]
Sql.Text := 'SELECT * FROM tiket T INNER JOIN (SELECT MIN(Item) AS MINIMO FROM tiket WHERE estatus =: 'NEW' ;
                                                                                                      ^^^^^ ;
                                                                                                   ^^
Debería ser
Código Delphi [-]
Sql.Text := 'SELECT * FROM tiket T INNER JOIN (SELECT MIN(Item) AS MINIMO FROM tiket WHERE estatus =: ''NEW'' ';

Admás no se bien qué es el "estatus =:"

Código:
procedure TFormCaja.SpeedButton1Click(Sender: TObject);
begin
    With ADOQuery1 do
        begin
        Close;
        Sql.Clear;
        Sql.Text := 'SELECT * FROM tiket T INNER JOIN (SELECT MIN(Item) AS MINIMO FROM tiket WHERE estatus =: ''NEW'' ';
        Open;
        ADOQuery1.First;

        while not ADOQuery1.Eof do
        begin
         Label1.Caption := 'A000' + ADOQuery1.fieldbyname('Item').asstring;
        end;


      end;
end;
Sigue dandome un error
Adjunto error

NOTA: el estatus es un campo que me dice si es nuevo 'NEW' o ya ha sido utilizado 'OLD' la idea que haga un filtro de todos lo que tengan la condicion 'NEW'

Última edición por giantonti1801 fecha: 29-03-2023 a las 20:43:36.
Responder Con Cita
  #11  
Antiguo 02-11-2022
cloayza cloayza is offline
Miembro
 
Registrado: may 2003
Ubicación: San Pedro de la Paz, Chile
Posts: 913
Poder: 22
cloayza Tiene un aura espectacularcloayza Tiene un aura espectacular
Estimado puede utilizar el método indicado por el colega kuan-yiu o usar parametros...

Código Delphi [-]
With ADOQuery1 do
       ... 
        //Utilizando Parametros
        Sql.Text := 'SELECT * FROM tiket T INNER JOIN (SELECT MIN(Item) AS MINIMO FROM tiket WHERE estatus =:Estatus';
        ParamByName('Estatus').AsString:='NEW';

        //kuan-yiu: Utilizando QuitedStr
        Sql.Text := 'SELECT * FROM tiket T INNER JOIN (SELECT MIN(Item) AS MINIMO FROM tiket WHERE estatus ='+QuotedStr('NEW');
        
        Open;
        ...

Saludos y buena suerte...
Responder Con Cita
  #12  
Antiguo 03-11-2022
Avatar de Neftali [Germán.Estévez]
Neftali [Germán.Estévez] Neftali [Germán.Estévez] is offline
[becario]
 
Registrado: jul 2004
Ubicación: Barcelona - España
Posts: 18.275
Poder: 10
Neftali [Germán.Estévez] Es un diamante en brutoNeftali [Germán.Estévez] Es un diamante en brutoNeftali [Germán.Estévez] Es un diamante en bruto
Cita:
Empezado por giantonti1801 Ver Mensaje
Perfecto! me funciona en Sql Manager sin ningun problema pero ahora me esta dando problema en la aplicacion
Si no dices "qué problemas" concretamente te está dando es difícil saber qué pasa.

Cita:
Empezado por giantonti1801 Ver Mensaje
No ni siquiera haciendo eso es que el error me lo da justamente es esta linea y no me deja compilarlo para verificar
Lo mismo.
Si tienes un error pero no das detalles de cual es, es difícil saber qué está pasando o darte más información.
__________________
Germán Estévez => Web/Blog
Guía de estilo, Guía alternativa
Utiliza TAG's en tus mensajes.
Contactar con el Clubdelphi

P.D: Más tiempo dedicado a la pregunta=Mejores respuestas.
Responder Con Cita
Respuesta



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
Saltar a Foro

Temas Similares
Tema Autor Foro Respuestas Último mensaje
Primer registro y ultimo registro Jose Roman OOP 4 26-07-2012 19:29:11
Consultar el primer registro de una tabla Jose Roman SQL 2 10-02-2010 23:30:00
selecciona el primer registro de mi tabla!! maru1981 OOP 1 01-08-2007 05:35:12
Primer registro de un ClientDataSet?? Berto2003 Varios 4 13-03-2007 17:24:49
Primer Registro alcides Varios 5 04-05-2005 17:34:37


La franja horaria es GMT +2. Ahora son las 22:06:15.


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
Copyright 1996-2007 Club Delphi