Ayuda SQL DISTINCT

Iniciado por TheGhost(Z), 22 Octubre 2009, 20:28 PM

0 Miembros y 1 Visitante están viendo este tema.

TheGhost(Z)

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:



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í

sempus

si es que se supone que los registros son iguales puedes hacerlo asi ("aunque enrealidad hay muchas formas de hacerlo")

Código (VISUALFOXPRO) [Seleccionar]

SELECT CLIENTE, MAX(CUIDAD) CIUDAD;
FROM CLIENTES;
GROUP BY CLIENTE
...si la tuviera detendría el tiempo para verla como lo hago en este momento y seria feliz eternamente...
Descarga openSUSE

^Tifa^

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


sempus

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
...si la tuviera detendría el tiempo para verla como lo hago en este momento y seria feliz eternamente...
Descarga openSUSE

^Tifa^

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.

;)

sempus

#5
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 (visualfoxpro) [Seleccionar]

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




Código (visualfoxpro) [Seleccionar]
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
...si la tuviera detendría el tiempo para verla como lo hago en este momento y seria feliz eternamente...
Descarga openSUSE

^Tifa^

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.

sempus

Cita de: ^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  ;)
Tranquila ^TiFa^  :-* , yo no considero que te expliques mal O.o

Cita de: ^TiFa^ en 22 Octubre 2009, 22:52 PM
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  :-*

...si la tuviera detendría el tiempo para verla como lo hago en este momento y seria feliz eternamente...
Descarga openSUSE

^Tifa^

#8
CitarPero 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 (sql) [Seleccionar]


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




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.

cassiani

#9
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!!