PDA

Ver la Versión Completa : El primer registro de tabla sql


giantonti1801
02-11-2022, 02:37:30
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


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

mamcx
02-11-2022, 03:21:58
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/7344731/sql-server-select-first-row-from-a-group


SELECT * FROM (
SELECT
*,
row_number() OVER(PARTITION BY AQUI_UN_CAMPO_AGRUPA ORDER BY order DESC) AS order

FROM tiket
)a WHERE order = 1

Neftali [Germán.Estévez]
02-11-2022, 08:36:38
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:

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.

duilioisola
02-11-2022, 15:24:52
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:

SELECT TOP 1 * FROM tiket where Estatus = 'NEW' order by numero

giantonti1801
02-11-2022, 17:27:12
;548898']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:

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


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;

kuan-yiu
02-11-2022, 17:32:58
Tienes el open antes de cargar la sentencia SQL

giantonti1801
02-11-2022, 17:58:48
Tienes el open antes de cargar la sentencia SQL


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

duilioisola
02-11-2022, 18:04:53
Aquí tienes un lío de comillas.

Sql.Text := 'SELECT * FROM tiket T INNER JOIN (SELECT MIN(Item) AS MINIMO FROM tiket WHERE estatus =: 'NEW' ;
^^^^^ ;
^^

Debería ser
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 =:"

kuan-yiu
02-11-2022, 18:09:16
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 ':'

giantonti1801
02-11-2022, 18:29:23
Aquí tienes un lío de comillas.

Sql.Text := 'SELECT * FROM tiket T INNER JOIN (SELECT MIN(Item) AS MINIMO FROM tiket WHERE estatus =: 'NEW' ;
^^^^^ ;
^^

Debería ser
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 =:"



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'

cloayza
02-11-2022, 18:37:44
Estimado puede utilizar el método indicado por el colega kuan-yiu o usar parametros...

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...

Neftali [Germán.Estévez]
03-11-2022, 09:20:27
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.

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.