Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   SQL (https://www.clubdelphi.com/foros/forumdisplay.php?f=6)
-   -   Extracción de campos (https://www.clubdelphi.com/foros/showthread.php?t=95058)

pablocarlos 09-02-2021 12:57:54

Extracción de campos
 
Saludos. Tengo una tablas en sql y necesito encontrar tres campos. Numero, Sorteo, Pais, Donde pais se esta pasando por parametro.
Escribo esto -->
Código SQL [-]
SELECT id_tiquet, Numero, Sorteo, Pais FROM tiket
Where  Numero = (SELECT MAX(Numero) from tiket WHERE Pais = : pais)  or Sorteo = (SELECT MAX(Sorteo) from tiket where Pais = : pais)
order by Sorteo desc LIMIT 1
Obvio que no trae lo que necesito.
El numero y sorteo debe ser el valor mayor dentro de la tabla filtrando por pais, osea Chile sorte 3 numero 49
Donde todos los registros de la tabla encuentra a todos los de Chile y dentro de ese pais el sorteo max y el numero max. Obvio que no funciona como es debido. Se agradece alguna sugerencia. Saludos!

kuan-yiu 09-02-2021 13:07:10

No sé si entendí bien los datos de la tabla
Código SQL [-]
select max(sorteo) from ticket
where numero=(select max(numero) from tiket where pais= : pais)

pablocarlos 09-02-2021 13:26:38

Gracias Kuan_yiu

Código SQL [-]
select Numero, Sorteo, Pais, max(Numero) from tiket
where Sorteo=(select max(Sorteo) from tiket where pais= : pais)
order by Sorteo desc LIMIT 1

Haciendo pruebas con tres paises no da el resultado deseado
Pais "Argentina" bien
Pais "Chile" bien
Pais "Uruguay" resultado numero max "1000000" sorte "2" pais "Argentina" cuando debería ser numero max 68 sorteo 2 pais Uruguay.
Sigo probando...

pablocarlos 09-02-2021 15:01:03

Código SQL [-]
select Numero, Sorteo, Pais, max(Numero) from tiket where Sorteo=(select max(Sorteo) from tiket where pais= : pais) order by Sorteo desc LIMIT 1
Gracias Kuan_yiu

Haciendo pruebas con tres paises no da el resultado deseado
Pais "Argentina" bien
Pais "Chile" bien
Pais "Uruguay" resultado numero max "1000000" sorte "2" pais "Argentina" cuando debería ser numero max 68 sorteo 2 pais Uruguay.
Sigo probando... Creo que debería filtrar primero por pais, luego dentro del país por max(sorteo) y dentro de país y sorteo y desde los valores encontrados mostrar el max(numero).

kuan-yiu 09-02-2021 15:33:02

Pon un ejemplo de los datos y exactamente la línea que quieres conseguir.

pablocarlos 09-02-2021 16:30:55

Cita:

Empezado por kuan-yiu (Mensaje 539941)
Pon un ejemplo de los datos y exactamente la línea que quieres conseguir.

Perfecto, Una tabla llamada tiket, campos ---> sorteo, numero, pais, id. tiket (hay otros campos pero no estàn involucrados) Concretamente necesito que busque un pais (ese sería el parametro) dentro de ese país encuentre el número de sorteo mayor (max(Sorteo) y dentro de ese rango de sorteo el numero mayor (max(numero)...
Ejemplo
tengo los siguientes datos pais uruguay (obvio hay otros paises) sorteos 1, 2, 3 (debería filtrar por el 3) numeros 1,2 ....1002 sorteo 2, números 1,2..1000 sorteo 3, (debería mostrar sorteo 3 y el numero 1000). Cerrando, con el parametro 'Uruguay' debería traer sorteo 3 numero 1000. Gracias por responder. Saludos

kuan-yiu 09-02-2021 17:06:00

Si he entendido bien quieres la línea completa. Para el país indicado el número máximo de cada sorteo.
Código SQL [-]
select a.* from tiket a
where a.pais= : pais and a.numero in
(select max(b.numero) numero from tiket b
where a.Sorteo=b.Sorteo)
order by a.sorteo
Como no indicas que motor de BD usas he tratado de hacerlo sin funciones especiales.

pablocarlos 09-02-2021 17:21:08

Cita:

Empezado por kuan-yiu (Mensaje 539945)
Si he entendido bien quieres la línea completa. Para el país indicado el número máximo de cada sorteo.
Código SQL [-]select a.* from tiket a where a.pais= : pais and a.numero in (select max(b.numero) numero from tiket b where a.Sorteo=b.Sorteo) order by a.sorteo

Como no indicas que motor de BD usas he tratado de hacerlo sin funciones especiales.

bd mysql. Lo extraño (para mi) que tus lineas funcionan en dos paises, busco un tercero y no encuentra nada, Gracias

Casimiro Noteví 09-02-2021 17:42:58

Es que después de un montón de mensajes no queda exactamente claro de lo que necesitas, y el motivo es que siempre se dice lo que se está haciendo, pero no realmente lo que se quiere hacer. Lo importante aquí es la estructura de las tablas involucradas (al menos los campos involucrados) y lo que se quiere conseguir.

Siempre aconsejo leer este hilo donde se explica cómo hacer mejor la pregunta, para obtener una respuesta más acertada.

pablocarlos 09-02-2021 17:52:13

Cita:

Empezado por Casimiro Notevi (Mensaje 539947)
Es que después de un montón de mensajes no queda exactamente claro de lo que necesitas, y el motivo es que siempre se dice lo que se está haciendo, pero no realmente lo que se quiere hacer. Lo importante aquí es la estructura de las tablas involucradas (al menos los campos involucrados) y lo que se quiere conseguir.

Siempre aconsejo leer este hilo donde se explica cómo hacer mejor la pregunta, para obtener una respuesta más acertada.


Veamos.... quiero filtrar la tabla tiket con campos pais, sorteo, numero, por un pais dentro de ese pais filtrar por max(sorteo) y dentro de ese sorteo por max(numero). bd mysql



pais = Chile
chile = sorteo 3
chile, sorteo 3 = numero 4
resultado chile, 3, 4 (pais, sorteo(el mayor), numero(el mayor))

Y no se como explicar mejor :(

Casimiro Noteví 09-02-2021 18:17:56

Cita:

Empezado por kuan-yiu (Mensaje 539937)
No sé si entendí bien los datos de la tabla

Cita:

Empezado por kuan-yiu (Mensaje 539941)
Pon un ejemplo de los datos y exactamente la línea que quieres conseguir.

Cita:

Empezado por kuan-yiu (Mensaje 539945)
Si he entendido bien quieres la línea completa. Para el país indicado el número máximo de cada sorteo.
Como no indicas que motor de BD usas he tratado de hacerlo sin funciones especiales.

Cita:

Empezado por Casimiro Notevi (Mensaje 539947)
..no queda exactamente claro de lo que necesitas.. Lo importante .. es la estructura de las tablas involucradas (al menos los campos involucrados) y lo que se quiere conseguir.

Yo creo que está claro que constantemente se ha repetido que no está claro y que se necesitaría un ejemplo de los datos, estructura de la tabla, etc.
Pero, bien, me parece que ya está más claro, lo que tienes es algo así:



Y quieres conseguir algo así como:

7 | CHILE | 3 | 16

¿Es eso?

pablocarlos 09-02-2021 18:34:26

Cita:

Empezado por Casimiro Notevi (Mensaje 539951)
Yo creo que está claro que constantemente se ha repetido que no está claro y que se necesitaría un ejemplo de los datos, estructura de la tabla, etc.
Pero, bien, me parece que ya está más claro, lo que tienes es algo así:





Y quieres conseguir algo así como:


7 | CHILE | 3 | 16


¿Es eso?

Exacto!

Gracias por tratar de entender

Casimiro Noteví 09-02-2021 19:58:34

Otra duda, si existe esto:
Cita:

5 | CHILE | 2 | 28
7 | CHILE | 3 | 16

¿Qué registro debe devolver?

pablocarlos 09-02-2021 20:07:19

Cita:

Empezado por Casimiro Notevi (Mensaje 539956)
Otra duda, si existe esto:

¿Qué registro debe devolver?

el 7 (mayor sorteo) con mayor numero osea si tengo chile 3, 16 y chile, 3, 17 debería devolver chile, 3, 17

Casimiro Noteví 09-02-2021 20:36:09

Ya estamos, no se entiende :confused::confused::confused:

pablocarlos 09-02-2021 21:00:24

Cita:

Empezado por Casimiro Notevi (Mensaje 539958)
Ya estamos, no se entiende :confused::confused::confused:


la consulta deberia devolver el id 285 chile, sorteo 2 numero 45 por que dentro de chile el sorteo mayor es el 2 y dentro del sorteo mayor (2) el numero mayor es el 45...

Ya con imagen creo no confundir. Gracias

pablocarlos 09-02-2021 21:01:00

No me permitio subir imagen

pablocarlos 09-02-2021 21:28:19

nuevo planteo


Tengo una tabla en mysql con los siguientes campos: id (autoincremental), pais(string), sorteo(int), numero(int).

necesito encontrar una fila con un determinado pais (este por parametro), dentro del pais encontrar el numero de sorteo más alto y dentro del sorteo el numero max... por ejemplo
tengo pais sorteo numero
chile 1 10
chile 1 12
chile 2 100
españa 1 2
españa 1 3
si busco por chile el resultado debería ser : chile-2-100 por que el sorteo mayor es 2 y el número mayor dentro del sorteo es 100. En el caso de españa debería encontrar españa,1,3
por que dentro de españa el numero de sorteo mayor es 1 y el número mayor en número es 3. Espero ser claro. Muchas gracias

Casimiro Noteví 09-02-2021 22:21:53

Cita:

Empezado por pablocarlos (Mensaje 539963)
chile 1 10
chile 1 12
chile 2 100
españa 1 2
españa 1 3
si busco por chile el resultado debería ser : chile-2-100 por que el sorteo mayor es 2 y el número mayor dentro del sorteo es 100. En el caso de españa debería encontrar españa,1,3
por que dentro de españa el numero de sorteo mayor es 1 y el número mayor en número es 3. Espero ser claro. Muchas gracias

Ya, pero eso no responde a mi duda, imagina que tienes:
#10 chile 1 10
#11 chile 1 120
#12 chile 2 10
#13 españa 1 2
#14 españa 1 3

¿Qué debería sacar de Chile, el registro #12, porque el 2 es mayor que el 1, o debería sacar el registro #11 porque 120 es mayor que 10?

pablocarlos 09-02-2021 22:26:26

Cita:

Empezado por Casimiro Notevi (Mensaje 539966)
Ya, pero eso no responde a mi duda, imagina que tienes:
#10 chile 1 10
#11 chile 1 120
#12 chile 2 10
#13 españa 1 2
#14 españa 1 3

¿Qué debería sacar de Chile, el registro #12, porque el 2 es mayor que el 1, o debería sacar el registro #11 porque 120 es mayor que 10?

el 12.
primero por pais, dentro de pais por numero de sorteo mayor y luego por numero mayor... en el ejemplo suyo sería el 12. Muchas gracias por estar presente!

Casimiro Noteví 10-02-2021 08:59:50

Entonces realmente es el mayor sorteo, el número no sirve para nada.

kuan-yiu 10-02-2021 09:30:53

Hay varios modos de hacerlo espero que este te sirva: Para un país todos los datos de la tupla con el mayor sorteo y dentro de este el mayor numero.
Código SQL [-]
select * from tiket a
where pais= : pais
and sorteo=(select max(sorteo) from tiket )
and numero=(select max(numero) from tiket b where a.sorteo=b.sorteo)

(Aunque yo cuantas más explicaciones leo menos entiendo)

pablocarlos 10-02-2021 14:03:21

Cita:

Empezado por kuan-yiu (Mensaje 539972)
Hay varios modos de hacerlo espero que este te sirva: Para un país todos los datos de la tupla con el mayor sorteo y dentro de este el mayor numero.

(Aunque yo cuantas más explicaciones leo menos entiendo)


Mientras más se aclara mas oscurece....


Para un país todos los datos de la tupla con el mayor sorteo y dentro de este el mayor numero. Exactamente


Probaré. Gracias


Casimiro: El numero si sirve. Kuan-yiu lo resumio perfecto: para cada pais los datos con el mayor sorteo y dentro de este el mayor numero.

Casimiro Noteví 10-02-2021 16:18:37

A ver, pongamos 2 casos:

#11 chile 1 120
#12 chile 2 10


Antes comentaste que ahí debe devolver el registro #12 porque el sorteo es mayor.
Y en este caso:

#11 chile 2 10
#12 chile 1 120


Debe devolver el registro #11 porque el sorteo es mayor.

O sea, lo dicho, el número no sirve para nada.

La única opción posible para devolver el número mayor es que existan sorteos repetidos:

#11 chile 1 10
#12 chile 1 120


En ese caso devolvería el #12, pero no creo que haya sorteos repetidos, así que insisto en que el número no sirve para nada :)

pablocarlos 10-02-2021 17:13:51

Cita:

Empezado por Casimiro Notevi (Mensaje 539976)
En ese caso devolvería el #12, pero no creo que haya sorteos repetidos, así que insisto en que el número no sirve para nada :)

hay sorteos repetidos. En un sorteo entran varios numeros por lo que el sorteo 3 (como todos los números de sorteos) tendrá un número del 1 al 1000000.
por eso el resultado debe ser un pais, dentro de ese pais un sorteo mayor y dentro de este un numero mayor.

Gracias por tu interés. Saludos

Casimiro Noteví 10-02-2021 18:27:58

Es lo que tiene el no explicar bien el problema, que tenemos que dar palos de ciego hasta que poco a poco vamos obteniendo toda la información ;)
Bien, entonces sí te sirve lo último publicado por kuan-yiu ^\||/

pablocarlos 10-02-2021 18:33:47

Cita:

Empezado por Casimiro Notevi (Mensaje 539980)
Bien, entonces sí te sirve lo último publicado por kuan-yiu ^\||/

Lamentablemente no. Pero sigo insistiendo con lo poco que se de sql. Gracias por estar. Saludos

pablocarlos 10-02-2021 19:23:51

Bueno. Como siempre cuando sale lo que uno busca, escribo la solución
Código SQL [-]
select id_tiquet, pais, Numero, Sorteo from tiket 
where numero <>0 and Pais = : pais and sorteo=(select max(sorteo))
and numero = (select max(numero))
ORDER by  Sorteo and Numero desc limit 1


Gracias a todos los que respondieron que de alguna u otra forma han logrado que obtuviera los resultados buscados...

Pido disculpas si "queme" alguna neurona por mis malas explicaciones, "cuando uno sabe lo que quiere cree que el mundo entenderá el problema". Tambien aprendí que debo plantear la duda lo más clara posible y con todos los datos para evitar --> Diria Casimiro "dar palos de ciego"... Gracias y feliz semana a todos!

Casimiro Noteví 10-02-2021 20:33:09

Me alegro de que por fin lo hayas solucionado ^\||/^\||/^\||/

cloayza 10-02-2021 21:08:44

Estimado PabloCarlos

Desde el principio no quedó claro su problema, si me permite, le aconsejo para futuras consultas aportar mas antecedentes.

Bueno tomando como base lo que han dicho los compañeros del foro, le propongo la siguiente consulta que creo puede responder a su problema.

Utilicé los datos aportados por Casimiro Notevi...

Código SQL [-]
select A.id_tiquet,
       A.pais,
       B.sorteo,
       B.numero

from tickets A,
     (
     select tickets.pais,
            tickets.sorteo,
            max(tickets.numero) numero
     from tickets,
          (select tickets.pais,
                  max(tickets.sorteo) sorteo
           from tickets
           where tickets.pais= : pais
           group by 1
           ) Sorteos
     
     where tickets.pais=Sorteos.pais and
           tickets.sorteo=Sorteos.sorteo
     group by 1,2
     ) B
where A.pais=B.pais and
      A.sorteo=B.sorteo and
      A.numero=B.numero

Espero le ayuda o aporte ideas para que logre la solución....
Saludos cordiales

cloayza 10-02-2021 22:22:27

Estimado PabloCarlos, está seguro que la consulta arroja los resultados esperados...Tengo mis dudas al respecto...

Cita:

Empezado por pablocarlos (Mensaje 539982)
Código SQL [-]
select id_tiquet, pais, Numero, Sorteo from tiket 
where numero <>0 and Pais = : pais and sorteo=(select max(sorteo))
and numero = (select max(numero))
ORDER by  Sorteo and Numero desc limit 1

Saludos cordiales

pablocarlos 11-02-2021 02:08:22

Cita:

Empezado por cloayza (Mensaje 539988)
Estimado PabloCarlos
Bueno tomando como base lo que han dicho los compañeros del foro, le propongo la siguiente consulta que creo puede responder a su problema.

De lujo!!!! Muchas gracias!! Saludos


La franja horaria es GMT +2. Ahora son las 02:34:11.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi