PDA

Ver la Versión Completa : DISTINCT con query


Robert
22-10-2003, 20:04:17
Hola con todos, tengo un pequeño problema con el componente query, resulta que estoy haciendo una sentencia algo asi:
SELECT DISTINCT referencia FROM CUENTA
esta sentencia solo me muestra el campo referencia, como hago para que me todos los demas campos
gracias por sus sugerencias

delphi.com.ar
22-10-2003, 20:11:56
SELECT DISTINCT *
FROM TABLA

SELECT DISTINCT CAMPO1, CAMPO2, CAMPO3...
FROM TABLA


Saludos!

Robert
22-10-2003, 20:27:18
He probado con SELECT DISTICT * from TABLA, pero no funciona, dado que yo necesito diferenciarlos por el campo referencia, es decir agrupar los registros que tengan diferente referencia, pero de un mismo cliente

SELECT DISTINCT referencia FROM TABLA
WHERE Cliente=:parametro

esta, me funciona como yo quiero, pero en el query solo se muestra el campo referencia, y cuando quiero mostrarlo en un DBGRID solo se muestra ese campo, cuando que quiero que se muestren todos los campos.
Nuevamente gracias por las sugerencias

roman
22-10-2003, 20:32:52
Es que esto no tendría mucho sentido: de dos registros con la misma referencia, ¿cuál sería el seleccionado?

// Saludos

delphi.com.ar
22-10-2003, 20:35:12
Si querés agrupar por un campo, entonces usá GROUP BY CAMPO.. y el resto de los campos tienen que estar afectados por una función de grupo. Y esto es mas que lógico sinó no tiene gracia el agrupamiento.

SELECT DISTINCT CAMPO1, MAX(CAMPO2)
FROM TABLA
GROUP BY CAMPO1

Saludos!

Robert
22-10-2003, 21:41:06
Roman, el problema no está en sí en la consulta, más bien yo diria en el componente query, mira tengo un DBGRID y un query que esta relacionado al dbgrid, a la vez este query está relacionado a una tabla (que tiene 15 campos), el problema es que en el query aparece solo el campo que pones despues de DISTINCT y los demas campos no están, por mas que uno le de Add all Fields.
Hay alguna forma de hacer que los demas campos se reflejen en el query y por lo tanto en el grid.

roman
22-10-2003, 21:45:50
Posteado originalmente por Robert
el problema no está en sí en la consulta, más bien yo diria en el componente query, mira tengo un DBGRID y un query que esta relacionado al dbgrid, a la vez este query está relacionado a una tabla (que tiene 15 campos), el problema es que en el query aparece solo el campo que pones despues de DISTINCT y los demas campos no están, por mas que uno le de Add all Fields.
Hay alguna forma de hacer que los demas campos se reflejen en el query y por lo tanto en el grid.

El problema sí está en la consulta, no en el Query. Un Query sólo te dará acceso a los campos que ennumeres en el SELECT.

// Saludos

roman
22-10-2003, 21:49:28
Ampliando un poco:

Un Query se encarga de mandar la consulta al servidor. El servidor ejecuta exactamente lo que viene en dicha consulta de manera que sólo regresará los campos que se le hayan pedido en la cláusula SELECT. Por tanto el Query no tiene forma de conocer los valores de los otros campos, ni siquiera sabe de su existencia.

// Saludos

Robert
22-10-2003, 22:28:39
Parece que primero debí haberte dicho que estoy trabajando en delphi 5.0 con tablas paradox, aqui hay un componente llamado query.
De acuerdo tu dices que yo ponga SELECT DISTINCT Campo1,campo2.... from TABLA, pero que sucede, si bien es cierto que aparecen en el query los campos que ponga despues del DISTINCT, esta conculta me da otro resultado del que si yo pusiera solo SELECT DISTINCT campo1. Es decir que cuando pongo SELECT DISTINCT campo1 from TABLA el resultado que me bota es el correcto(ya hice la prueba), pero cuando yo pongo SELECT DISTINCT Campo1,Campo2,Campo3........from TABLA
(ojo que tengo como 15 campos), el resultado es otro, (claro que aqui en el query aparecen todos los campos que ponga despues del DISTINCT), ademas, en este caso parece que te hace la distincion entre todos los campos que ponga despues del DISTINCT, con lo cual el resultado es otro.

:confused: Hay alguna forma en la cual ponga SELECT DISTINCT Campo1 FROM TABLA, y cuando me muestre en el DBGRID me muestre esta consulta pero con todos los campos

roman
22-10-2003, 22:46:17
Realmente no importa si es paradox, interbase, mysql o cualquier otro. Entra al Database Desktop y haz las consultas ahí y verás que te da los mismos resultados que has visto.

El problema aquí está en una incorrecta interpretación de lo que significa este tipo de consultas.

DISTINCT le dice al servidor:

De los registros que encuentres traeme sólo una copia de aquellos que estén repetidos.

Pero para que dos regitros se consideren repetidos deben coincidir todos sus campos (los incluídos en la consulta)

Suponte que tu tabla es algo así:


id | nombre | referencia
1 | peter | 84
2 | paul | 35
3 | mary | 84


Si tu consulta es

select distinct * from tabla

los registros que encuentra son

(1, peter, 84)
(2, paul, 35)
(3, mary, 84)

Como no hay ninguno repetido te rgresa todos.

Si la consulta es

select distinct referencia from tabla

los registros encontrados son

(84)
(35)
(84)

(Así, sin más campos)

Como el primero y el tercero se repiten entonces sólo te regresa

(84)
(35)

Parece que tu quisieras que te regresara todos los campos pero sólo uno con referencia=84. Sin embarg hay dos:

(1, peter, 84)
(3, mary, 84)

¿Cómo podría el servidor saber cuál de estos dos regresar?

De cualquier forma, quizá no estemos entendiendo del todo cuál es tu propósito. Si nos ejemplificas con unos registros en concreto (tal como los de arriba, ¡sin los 15 campos!) sabremos con más detalle lo que deseas. Indica también, usando dichos ejemplos, los resultados que esperarías.

// Saludos

Robert
22-10-2003, 23:09:33
Estamos de acuerdo con lo que has escrito.
------------------
select distinct referencia from tabla

Parece que tu quisieras que te regresara todos los campos pero sólo uno con referencia=84. Sin embarg hay dos:

(1, peter, 84)
(3, mary, 84)
---------------------
Aqui me estas mal-interpretando, se que me va regresar los registros diferentes pero yo quisiera, que me devuelva en ese formato digamos.
(1, peter,84)
(3, mary,84)
¿Aunque por lo que he provado y lo que me has escrito no se puede?
de todos modos espero tu respuesta

roman
22-10-2003, 23:30:05
Posteado originalmente por Robert
Aqui me estas mal-interpretando, se que me va regresar los registros diferentes pero yo quisiera, que me devuelva en ese formato digamos.
(1, peter,84)
(3, mary,84)


Disculpa pero como te dije antes, no nos estamos entendiendo. Del ejemplo que puse, para obtener esos registros harías

select * from tabla where referencia = 84

Pero en estos momentos ya no quda claro si lo que deseas es un distinct, un where o un group. Te aconsejo que mandes un ejemplo de lo que quieres obtener. Un ejemplo en donde se vea por qué cuál sería la diferencia que mencionas.

// Saludos

Robert
23-10-2003, 00:14:04
Ok tengo lo siguiente:

cliente factura referencia --------y mas campos
aa 1 22
bb 2 23
cc 3 24
aa 4 22
dd 5 25
bb 6 23
yo hago SELECT DISTINCT referencia FROM TABLA (ojo a toda la tabla sin una clausula where)
me bota

referencia
22
23
24
25

hay alguna forma para que me bote bote algo asi
cliente factura referencia -------y mas campos
aa 1 22
bb 2 23
cc 3 24
dd 5 25

claro que si pongo SELECT DISTINCT factura,referencia,cliente FROM TABLA , aparecen esos campos sin embargo los registros seleccionados son diferentes al caso anterior(donde tengo 4 registros), con esta nueva sentencia me aparecen los seis registros iniciales

roman
23-10-2003, 00:28:13
Es que este es el problema:

De estos dos registros:

aa 1 22
aa 4 22

si únicamente seleccionas el campo referencia entonces al servidor le da lo mismo cuál regresar y sóo devuelve un 22, pero si seleccionas más campos, el servidor no tiene manera de escoger cuál de los dos regresar.

Pienso que el problema aquí es de concepto, no es un problema ni con la componente Query ni con la consulta: olvidándote un momento de sql, querys e incluso programación, si a ti te dan una lista en papel como esta:

aa 1 22
bb 2 23
cc 3 24
aa 4 22
dd 5 25
bb 6 23

y te piden que entregues las filas donde no se repita la tercera columna pero que incluya todas las columnas, ¿qué harías tú? ¿Cómo decides cuál de entre (aa, 1, 22) y (aa, 4, 22) enregar? ¿O entre (bb, 2, 23) y (bb, 6, 23)? ¿Al azar?

// Saludos

Jose_Pérez
03-11-2003, 15:03:24
Creo entender el problema, porque a mí me está pasando lo mismo. Y si es así, el problema no está en los campos devueltos, sino en el resultado de los registro.

Por ejemplo, supongamos que tenemos una línea de facturas con tres campos: Cliente,NumeroFactura y FechaFactura... además de otros campos.

Esta consulta:


Select distinct Cliente from Tabla Where (lo que sea)


Devuelve todos los clientes que cumplen la condición del Where.

Ahora bien, si quiero que me devuelva el mismo resultado, pero además con el resultado de los campos NumeroFactura y FechaFactura (independientemente del valore que contengan), el resultado no es el mismo (en numero de registros), y se repiten registros con el mismo número de Cliente.


Select distinct Cliente,NumeroFactura,FechaFactura from Tabla Where (lo que sea)


Lo que se busca (si realmente funcionara), sería hacer esto.


Select (distinct Cliente),NumeroFactura,FechaFactura from Tabla Where (lo que sea)


Saludos.

roman
03-11-2003, 15:53:38
Jose_Pérez comentó:
Lo que se busca (si realmente funcionara), sería hacer esto.


Select (distinct Cliente),NumeroFactura,FechaFactura from Tabla Where (lo que sea)



Viene siendo lo mismo. Al seleccionar únicamente al Cliente entonces tiene sentido regresar un sólo registro por cada cliente. Pero al momento de querer más datos ¿cómo sabes cuéles registros quieres? El cliente, segun la tabla que presentas, puede tener varias facturas, entonces, por cada cliente ¿cuál factura regresas?

// Saludos