Foro de elhacker.net

Programación => Bases de Datos => Mensaje iniciado por: TheGhost(Z) en 22 Octubre 2009, 20:28 pm



Título: Ayuda SQL DISTINCT
Publicado por: TheGhost(Z) en 22 Octubre 2009, 20:28 pm
Hola, amigos.

Saben tengo una tabla "CLIENTES" con los campos "CLIENTE" y "CIUDAD". Lo que deseo es mostrar los clientes sin repeticiones y la ciudad con repeticiones. Para ello he utlilizado:


Código:
RS.Open "SELECT DISTINCT CLIENTE  FROM CLIENTES", DBConex, adOpenStatic, adLockReadOnly
If RS.RecordCount > 0 Then
    Dim list_item As ListItem
    Do While Not RS.EOF
         Set list_item = ListView1.ListItems.Add(, , ,)
         list_item.SubItems(1) = RS!CLIENTE
         list_item.SubItems(2) = RS!CIUDAD
         RS.MoveNext
         DoEvents
    Loop
End If
RS.Close
Set RS = Nothing

Luego al cargar a un ListView me dice que el campo CIUDAD no existe. Por ello modifique la consulta y agregue "DISTINCT CLIENTES, CAMPOS". Lo malo es que no me muestra los datos que se repiten en el campo CIUDAD.

¿alguna sugerencia?

Saludos,
Pedro Jerí


Título: Re: Ayuda SQL DISTINCT
Publicado por: sempus en 22 Octubre 2009, 20:39 pm
si es que se supone que los registros son iguales puedes hacerlo asi ("aunque enrealidad hay muchas formas de hacerlo")

Código
  1. SELECT CLIENTE, MAX(CUIDAD) CIUDAD;
  2. FROM CLIENTES;
  3. GROUP BY CLIENTE
  4.  


Título: Re: Ayuda SQL DISTINCT
Publicado por: ^Tifa^ en 22 Octubre 2009, 21:44 pm
Que pena que estes pasando por este dilema  ;)

Puedes hacerlo de la siguiente manera (Pero el resultado impreso a lo mejor no quede en el orden que lo quieres tener)

SELECT DISTINCT CLIENTE FROM CLIENTES
UNION ALL
SELECT CIUDAD FROM CLIENTES;

Los datos mostrados seria primero los clientes unicos, y abajo de estos todas las Ciudades repetidas.



Título: Re: Ayuda SQL DISTINCT
Publicado por: sempus en 22 Octubre 2009, 21:58 pm
LOL

^TiFa^ si no lo vueltes a decir no caigo en el error que cometi xD , lei mal el enunciado, pense que solo le importaba mostrar los clientes sin repeticiones.


EDITO: ya lo editaste :/ asi que si alguien no entiende no importa xD


Título: Re: Ayuda SQL DISTINCT
Publicado por: ^Tifa^ en 22 Octubre 2009, 22:01 pm
Tranquilo chico  :-*   :-*  es entendible lo que yo entiendo es que el quiere los Clientes unicos que no se repitan, y todas las Ciudades se repitan y no.  Con ese UNION ALL el podria obtener esos datos, ahora el orden del mostrado bueno... ahi no lo puedo ayudar, ya que primero se imprimiran en pantalla todos los clientes unicos y debajo de estos todas las ciudades repetidas y no.

 ;)


Título: Re: Ayuda SQL DISTINCT
Publicado por: sempus en 22 Octubre 2009, 22:25 pm
acabo de hacer una consulta con lo que mencionas :/ tienes razón (porque la tienes :P ) pero (siempre hay un pero), tal y como esta, no se pueden saber las ciudades de esos clientes :/  amenos que sea

Código
  1. SELECT  CLIENTE, MAX(CIUDAD) CIUDAD FROM CLIENTES GROUP BY CLIENTE;
  2. UNION ALL;
  3. SELECT CLIENTE , CIUDAD FROM CLIENTES
  4.  



Código
  1. SELECT  CLIENTE, MAX(CIUDAD) CIUDAD FROM CLIENTES GROUP BY CLIENTE;
(Suponiendo que siendo el mismo cliente, la ciudad no sea distinta :/ , igual con lo inverso)

EDITO: la verdad, como dijo ^TiFa^ antes de editarlo, curioso xD


Título: Re: Ayuda SQL DISTINCT
Publicado por: ^Tifa^ en 22 Octubre 2009, 22:52 pm
Tuve que editar porque me explico terriblemente mal  :rolleyes: pero captaste la idea de lo que decia  ;)

Recuerda que la funcion MAX lo que hace es averiguar cual es el record numerico mas alto de un registro dentro de una tabla, tambien ten pendiente que el campo CIUDAD guarda datos no numericos sino de caracteres  ;) por lo que te imprimira la CIUDAD en este caso que empieze con el caracter alfabetico mas aproximado a 'Z' que es el ultimo caracter del abacedario  :rolleyes:  

Imaginate que tengas esto

Maria  Argentina
Carlos Peru

Obtendrias un resultado como el siguiente utilizando esta consulta :

SELECT  CLIENTE, MAX(CIUDAD) CIUDAD FROM CLIENTES GROUP BY CLIENTE;

Maria Peru
Carlos Peru



No se la verdad a lo mejor yo interprete mal su peticion, pero lo que entiendo es que el quiere saber los clientes unicos no repetidos que posee la tabla (con la clausula DISTINCT) le basta. Y quiere saber los registros del campo Ciudades que se repiten y no se repitan en resumen todos los registros del campo CIUDAD.


Título: Re: Ayuda SQL DISTINCT
Publicado por: sempus en 22 Octubre 2009, 23:19 pm
Tuve que editar porque me explico terriblemente mal  :rolleyes: pero captaste la idea de lo que decia  ;)
Tranquila ^TiFa^  :-* , yo no considero que te expliques mal O.o

Imaginate que tengas esto

Maria  Argentina
Carlos Peru

Obtendrias un resultado como el siguiente utilizando esta consulta :

SELECT  CLIENTE, MAX(CIUDAD) CIUDAD FROM CLIENTES GROUP BY CLIENTE;

Maria Peru
Carlos Peru


Permite Discrepar ^TiFa^

lo que dices es cierto si fuera asi

Maria  Argentina
Carlos Peru
Maria  Peru

Pero de lo contrario no, porque si existe solo una Maria en la tabla no hay razón para que el MAX( ) de ese resultado  ;)

EDITO: Igual, creo que lo utilizo mas por costumbre que por conveniencia xD , no es necesario usar un MAX() para usar el group by xD

salu2  :-*



Título: Re: Ayuda SQL DISTINCT
Publicado por: ^Tifa^ en 23 Octubre 2009, 03:25 am
Citar
Pero de lo contrario no, porque si existe solo una Maria en la tabla no hay razón para que el MAX( ) de ese resultado

Si ternura te entiendo en parte, aunque debes asumir que si el usuario que inicio el post dijo yo quiero todos aquellos clientes unicos que no se repitan, es porque de alguna manera el debe tener muchos clientes repetidos. Imaginate que yo tengo la siguiente tabla:

mysql> select * from clientes;
+---------+-----------+
| cliente | ciudad    |
+---------+-----------+
| Maria   | Mexico    |
| Carlos  | Peru      |
| Luis    | Africa    |
| Matias  | Peru      |
| Ana     | Argentina |
| Luis    | Mexico    |
| Ana     | Brazil    |
| Maria   | Uruguay   |
+---------+-----------+
8 rows in set (0.00 sec)

Como veras hay clientes repetidos en el caso de la tabla expuesta tenemos como clientes repetidos a 'Ana' y 'Maria'  Como tambien puedes observar cada una de ellas esta en un pais distinto. Ahora que ocurre con esta consulta:

mysql> select cliente, max(ciudad) from clientes group by cliente;
+---------+-------------+
| cliente | max(ciudad) |
+---------+-------------+
| Ana     | Brazil      |
| Carlos  | Peru        |
| Luis    | Mexico      |
| Maria   | Uruguay     |
| Matias  | Peru        |
+---------+-------------+
5 rows in set (0.00 sec)

Al utilizar la funcion MAX(ciudad) estas diciendo a la consulta, devuelveme todos los registros que tengan el mayor valor (si fueran campos numericos) pero como son campos caracteres, el MAX() lo que hace es retornar todas aquellas frases que empiezen con el caracter que se aproxime mas a la letra 'Z' que es la ultima del abecedario y la cual vendria siendo la de mayor valor si fuese numerica. Por ende la consulta anterior devuelve a 'Ana' con Ciudad 'Brazil' (Ya que Ana en ciudad Argentina, recuerda que Argentina empieza por 'A' por lo cual 'Brazil' es mayor por empezar con 'B' por eso la consulta te retorna el valor de 'Ana' que le pertenece 'Brazil' y no 'Ana' que le pertenece 'Argentina'  lo mismo ocurre para 'Maria' se retorna 'Maria de Uruguay' y no 'Maria de Mexico' el caracter 'U' de Uruguay esta mas cerca de la 'Z' que la 'M' de 'Mexico' ;)  no se si me explico  :-\ )

Prosigo, recuerda que el usuario que inicio este post dijo, yo quiero todos los Clientes unicos no repetidos (por lo cual en parte de la peticion de Clientes tu consulta estaria correcta devuelve los clientes unicos no repetidos) pero.... porque hay otro pero en el aire :) recuerda que el amigo solicito que tambien queria todas las ciudades se repitiesen o no.... entonces, si utilizamos la funcion MAX() como propones y al utilizar el GROUP BY que es una clausula que dice por cada uno, que hara tu consulta? MAX le dara prioridad a 'Maria de Brazil' pero que pasa con 'Argentina' el usuario no quiere a 'Maria Argentina' pero si quiere a 'Argentina', entonces que pasa con la ciudad 'Argentina' con la consulta usando MAX y GROUP BY????  se queda fuera, asi de simple. Sin embargo con un UNION ALL

Código
  1.  
  2. mysql> SELECT DISTINCT cliente FROM clientes
  3.    -> UNION ALL
  4.    -> SELECT ciudad FROM clientes;
  5. +-----------+
  6. | cliente   |
  7. +-----------+
  8. | Maria     |
  9. | Carlos    |
  10. | Luis      |
  11. | Matias    |
  12. | Ana       |
  13. | Mexico    |
  14. | Peru      |
  15. | Africa    |
  16. | Peru      |
  17. | Argentina |
  18. | Mexico    |
  19. | Brazil    |
  20. | Uruguay   |
  21. +-----------+
  22. 13 ROWS IN SET (0.00 sec)
  23.  
  24.  
  25.  

De los cuales :

Clientes unicos no repetidos:

 Maria     |
| Carlos    |
| Luis      |
| Matias    |
| Ana 

Todas las ciudades repetidas o no:

| Mexico    |
| Peru      |
| Africa    |
| Peru      |
| Argentina |
| Mexico    |
| Brazil    |
| Uruguay   |

De esa manera el chico obtiene los clientes unicos no repetidos, y obtiene todas las ciudades se repitan o no... lamentablemente los datos vienen juntos con el UNION ALL primero imprime los clientes unicos y debajo de estos todas las ciudades... por lo cual le dije que el debia filtrar o buscar la forma de obtener esos datos individualmente o imprimirlos asi en su Listbox.


Título: Re: Ayuda SQL DISTINCT
Publicado por: cassiani en 23 Octubre 2009, 04:18 am
Bueno, el caso está en que no sabemos exactamente que es lo que el chico desea y estamos acá suponiendo que es lo que quiere, yo lo que entendi, es que desea que en la consulta se muestren los clientes sin que se repitan independientemente de la ciudad (algo raro, pero es lo que entendi).

saludos!!


Título: Re: Ayuda SQL DISTINCT
Publicado por: seba123neo en 23 Octubre 2009, 05:16 am
yo sinceramente tampoco entendi con exactitud lo que quiere TheGhost(Z) , que nos muestre lo que quiere y no s de un ejemplo, porque no podemos seguir "suponiendo".

saludos.


Título: Re: Ayuda SQL DISTINCT
Publicado por: ^Tifa^ en 23 Octubre 2009, 06:23 am
Yo entendi esto:

Citar
mostrar los clientes sin repeticiones y la ciudad con repeticiones.

Lo malo es que no me muestra los datos que se repiten en el campo CIUDAD.

Mostrar Clientes unicos sin repeticiones y Mostrar todas las ciudades se repitan o no. Si esto es lo que el realmente quiere, me temo que el GROUP BY seria obsoleto ya que lo limitaria solo a mostrar registros unicos tanto de Clientes como Ciudad.



Título: Re: Ayuda SQL DISTINCT
Publicado por: seba123neo en 23 Octubre 2009, 06:31 am
me temo que el GROUP BY seria obsoleto ya que lo limitaria solo a mostrar registros unicos tanto de Clientes como Ciudad.

eso esta mas que claro, cualquiera que sabe algo de SQL saber que no puede agrupar de esa forma, esperemos entonces que nos responda el autor del post.


Título: Re: Ayuda SQL DISTINCT
Publicado por: ^Tifa^ en 23 Octubre 2009, 14:43 pm
Supongo que si seba123neo   :-*   :-*   :-*

Por cierto, se puede confundir la peticion del chico un pelin  :rolleyes:

Rectifico, si el chico en cuestion lo que desea es los clientes unicos no repetidos y las ciudad repetidas el podria optar por lo siguiente:

Código
  1.  
  2. SELECT DISTINCT CLIENTE FROM CLIENTES
  3. UNION ALL
  4. SELECT CIUDAD FROM CLIENTES HAVING COUNT(CIUDAD) > 2
  5.  
  6.  

Asi obtendria todos los clientes unicos no repetidos, y todas las ciudades repetidas mas de una vez  ;)


Título: Re: Ayuda SQL DISTINCT
Publicado por: Angeldj27 en 23 Octubre 2009, 15:07 pm
Creo que la consulta seria
Código:
Select DISTINCT CLIENTE, CIUDAD From CLIENTE

Porque si se fijan si se fijan a lo que el se refiere es a los clientes que no se repiten independiente del nombre que tengan porque si tienen el mismo nombre de Maria pero una Vive Mexico y la otra en Uruguay los registros no estan repetidos porque son dos clientes diferentes totalmente porque viven en diferentes ciudades u de esa forma creeo k es lo mas logico...   ;D


Título: Re: Ayuda SQL DISTINCT
Publicado por: ^Tifa^ en 23 Octubre 2009, 15:42 pm
Citar
Porque si se fijan si se fijan a lo que el se refiere es a los clientes que no se repiten independiente del nombre que tengan porque si tienen el mismo nombre de Maria pero una Vive Mexico y la otra en Uruguay los registros no estan repetidos porque son dos clientes diferentes totalmente porque viven en diferentes ciudades u de esa forma creeo k es lo mas logico...

Si pero fijate:

Citar
Lo malo es que no me muestra los datos que se repiten en el campo CIUDAD.

Entonces si solo muestra Maria de Mexico, Uruguay donde queda??? el no quiere a Maria y Uruguay, pero si quiere a Uruguay y a Mexico.


Título: Re: Ayuda SQL DISTINCT
Publicado por: cassiani en 23 Octubre 2009, 16:25 pm
uhmm ok, ubique mi error .. uhm. ..


Título: Re: Ayuda SQL DISTINCT
Publicado por: Angeldj27 en 23 Octubre 2009, 16:46 pm
Si pero como son de dos diferentes paises la sentencia la va a enviar como si fueran diferntes y te la va a presentar asi

+---------+-----------+
| cliente | ciudad    |
+---------+-----------+
| Maria   | Mexico     |
| Maria   | Uruguay   |
+---------+-----------+

porque maria se repite pero cada ciudad es diferente pero a lo que el se refiere es que no le presenta otros nombres con la misma ciudad pero de esta forma lo muestra osea si aparece luis de Mexico lo va a mostrar sin ningun problema.  :silbar:

Saludos...


Título: Re: Ayuda SQL DISTINCT
Publicado por: TheGhost(Z) en 24 Octubre 2009, 13:21 pm
Hola, perdonen que no haya entrado al post. La idea es tal y cual me ha entendido ^TiFa^.

Tengo una base de datos con 16 Mil clientes y de los cuales hay muchos repeditos.  por jemplo como estos...

Cliente    Ciudad
Pedro     Lima
Pedro     Buenos Aires
Pedro     Madrid
Juan       Lisboa
Miguel    Lima
Miguel    Madrid
Miguel    Lisboa

Lo que deseo es recuperar al menos una ciudad para cada cliente único:

Pedro  LIma
Juan    Lisboa
Miguel LIma

Es decir, al menos recuperar una ciudad por cada cliente. he intentando con DISTINCT Clientes, pero al coger el campo Ciudad me dice que no existe. Por ello Hice DISTINCT Clientes, Ciudad. ahora no me da error pero el problema es que ya no me muestra a Miguel


Título: Re: Ayuda SQL DISTINCT
Publicado por: TheGhost(Z) en 24 Octubre 2009, 15:48 pm
Holas!
Finalmente, gracias a sus aportes, pude resolver mi problema:

Cliente    Ciudad
Pedro       Lima
Pedro       Buenos Aires
Pedro       Madrid
Juan         Lisboa
Juan         Santander
Miguel      Lima
Miguel      Madrid
Miguel      Lisboa

Con este
Código:
SELECT CLIENTE, MAX(CIUDAD) AS CIUDAD FROM CLIENTES GROUP BY CLIENTE

Obtuve los siguiente...

Cliente    Ciudad
Pedro        Buenos Aires
Juan          Lisboa
Miguel       Lima

Un millon de gracias a todos..    :)


Título: Re: Ayuda SQL DISTINCT
Publicado por: sempus en 24 Octubre 2009, 16:50 pm
TheGhost(Z) me alegra haberte entendido desde el principio xD , y me alegra también que lo hayas solucionado con la primer respuesta que fue la mía :P

salu2


Título: Re: Ayuda SQL DISTINCT
Publicado por: ^Tifa^ en 24 Octubre 2009, 20:47 pm
Me alegra que hayas podido resolver tu asunto, por lo visto yo entendi mal tu peticion, pensaba que eran todos los clientes unicos, y todas las ciudades se repitan o no. No sabia que querias todas las ciudades por clientes unicos.... en ese caso si sirve el GROUP BY


Título: Re: Ayuda SQL DISTINCT
Publicado por: TheGhost(Z) en 25 Octubre 2009, 14:48 pm
En realidad no lo capté al inicio, sino después de leerlo 03 veces de arriba abajo. Estaba confundido con lo de MAX(CIDUAD) xq creí que solo era para números. Luego de aclarme seguía confundido; ya que, penzaba que me hiba a mostrar la ciudad mayor de todo el campo CIUDAD. Pero por el intercambio de opiniones de ambos me di cuenta que era la ciudad mayor que el mismo cliente tenía.

Bueno, no tengo más palabras de agradecimiento..


Título: Re: Ayuda SQL DISTINCT
Publicado por: ^Tifa^ en 26 Octubre 2009, 21:34 pm
Bueno en realidad cielo, el MAX(Ciudad) lo que hace es mostrarte la Ciudad en este caso donde el caracter de inicio de la palabra se aproxime mas a la 'Z' del alfabeto que es la ultima palabra del alfabeto.

Si tu tienes 2 Ciudades:

Argentina
Mexico

Y haces MAX(Ciudad) el te devolvera la palabra que su primer caracter se aproxime a la 'Z' en este caso 'Mexico' su primer caracter 'M' esta mas cercano a la 'Z' que la 'A' de 'Argentina'  ;)  Asi es como va MAX en caracteres.