Ir al contenido


Foto

[RESUELTO] No visualizar registros con campo con valores repetidos


  • Por favor identifícate para responder
20 respuestas en este tema

#1 luk2009

luk2009

    Advanced Member

  • Moderadores
  • PipPipPip
  • 2.040 mensajes
  • LocationSanto Domingo

Escrito 21 enero 2011 - 11:09

Tengo la siguiente consulta:



delphi
  1. with DMmonitorenred.ZQactivas do
  2.   begin
  3.     Close;
  4.     SQL.Clear;
  5.     SQL.add('select * from  Activas inner join evento on activas.evento=evento.evento left join acmsub on activas.csid=acmsub.csid ');
  6.     SQL.add(&#39; where completa <> :pcompleta &#39;);
  7.     SQL.Add(&#39;order by alarmnum desc&#39;);
  8.     ParamByName(&#39;pcompleta&#39;).AsString:=&#39;COMPLETADA&#39;;



y con ella puedo obtener esto
               
Imagen Enviada
lo que quiero es que si hay varios registros con el campo evento con el mismo valor ejemplo de arriba MA00 y que  el campo completa<> 'completada' solo me visualize uno de ellos.

si hago esto:


sql
  1. SELECT DISTINCT ACTIVAS.evento FROM  Activas INNER JOIN evento ON activas.evento=evento.evento LEFT JOIN acmsub ON activas.csid=acmsub.csid
  2. WHERE completa <> &#39;COMPLETADA&#39;
  3. ORDER BY alarmnum DESC



funciona, pero necesito todos los campos de mi consulta.

Como podria hacer esto?
  • 0

#2 felipe

felipe

    Advanced Member

  • Administrador
  • 3.283 mensajes
  • LocationColombia

Escrito 22 enero 2011 - 08:50

¿Te serviría añadiendo rows 1 a la consulta?


Saludos!
  • 0

#3 luk2009

luk2009

    Advanced Member

  • Moderadores
  • PipPipPip
  • 2.040 mensajes
  • LocationSanto Domingo

Escrito 22 enero 2011 - 02:45

Gracias Felipe por responder, creo que he cometido un error al explicar el caso, ya que necesito que muestre un solo evento igual por cada cuenta ejemplo:

dato#        cuenta  evento   
0213213      0001    MA00     
0232133      0001    MA00     
0232444      0005    BA01     
0232323      0005    BA01
0323213      0001    BA06
0232447      0005    MA00
0323219      0005    MA00

QUISIERA QUE SALIERA

dato#        cuenta  evento
0232133      0001    MA00
0232444      0005    BA01
0323213      0001    BA06
0232447      0005    MA00

con ello obviar el visualizar los registros cuyo campo evento sean repetidos de un deteminado cliente, siempre y cuando el campo estatus tenga un valor diferente a completada.

Espero haber sido mas claro ahora.
  • 0

#4 Delphius

Delphius

    Advanced Member

  • Administrador
  • 6.295 mensajes
  • LocationArgentina

Escrito 22 enero 2011 - 02:50

Hola luk2009,
¿Cómo están relacionadas o estructuradas las tablas?

A como lo estoy entendiendo, intuyo y me inclino a pensar que lo buscas es que te agrupe, además, por el campo evento.  ;)

Naturalmente, si empleas DISTINCT lo que consigues es que tome al primer registro de los coincidentes. Por ejemplo si tienes 200 registros y 40 de ellos en el campo eventos tienen el valor MA00 entonces la consulta regresará el primer registro detectado y descartará los 39 restantes. Lo mismo sucederá con los 160 restantes, repitiendo lo mismo para cada valor hallado.

Entonces, al finalizar, tendrás N registros: MA00, MA01...MA02....MANN. Uno por cada valor diferente.

Si en verdad estás buscando que muestre todos los registros entonces no debes eliminar los "duplicados".

Saludos,
  • 0

#5 luk2009

luk2009

    Advanced Member

  • Moderadores
  • PipPipPip
  • 2.040 mensajes
  • LocationSanto Domingo

Escrito 22 enero 2011 - 03:02

Gracias Delphius por responder.

Te lo voy a poner en contexto, es un sistema que monitorea alarmas contra robos y si por ejemplo al cliente 0001 le suena la alarma por la zona 2:
cliente    evento
0001        BA02
aunque esta alarma suene varias veces, si es por la misma zona, solo quiero que el operador vea uno de los eventos y asi evitar que se llene el dbgrid con registros que al final se completaran en conjunto por cada cliente.


  • 0

#6 Delphius

Delphius

    Advanced Member

  • Administrador
  • 6.295 mensajes
  • LocationArgentina

Escrito 22 enero 2011 - 03:17

Pues... estoy confundido  :(

Porque dices:

(...)pero necesito todos los campos de mi consulta.


Te agradecería si nos pudieras dar una descripción de las tablas que intervienen y como están relacionadas. Esto ayudaría a entender el problema.

Saludos,
  • 0

#7 luk2009

luk2009

    Advanced Member

  • Moderadores
  • PipPipPip
  • 2.040 mensajes
  • LocationSanto Domingo

Escrito 22 enero 2011 - 03:45

Lo que quiero decir con todos los campos, es porque si pongo distinct, solo se ven los campos que indique.
Las demas tablas son para complementar la informacion, ejemplo la tabla acmsub es la de los clientes, asi se que el cliente 0001 es fulano de tal y la  tabla evento es la que define que BA01 significa robo en la zona 1.

Pero los datos que necesito no repetir estan en una sola tabla llamada activa.

podemos llevar esto a una sola tabla que tenga por ejemplo 5 campos

numero  fecha            cliente  evento    estatus
100001  15/01/2010    0001    BA01      PENDIENTE
100002  15/01/2010    0001    BA01      PENDIENTE
100005  15/01/2010    0001    BA01      PENDIENTE
100020  15/01/2010    0001    BA01      PENDIENTE
100025  15/01/2010    0021    MA01      PENDIENTE
100028  15/01/2010    0021    MA01      PENDIENTE
100041  15/01/2010    0001    MA01      PENDIENTE

Quiero que se vea:

numero  fecha            cliente  evento    estatus
100001  15/01/2010    0001    BA01      PENDIENTE
100025  15/01/2010    0021    MA01      PENDIENTE
100041  15/01/2010    0001    MA01      PENDIENTE
 
  • 0

#8 Delphius

Delphius

    Advanced Member

  • Administrador
  • 6.295 mensajes
  • LocationArgentina

Escrito 22 enero 2011 - 10:25

Hola,

Le estuve dando vueltas al problema pero no hay caso. No le encuentro manera de entrarle...  :(  Tengo mi cabeza frita  :

Me hace falta una buena siesta... además de que llevo días sin dormir bien.

Saludos,
  • 0

#9 luk2009

luk2009

    Advanced Member

  • Moderadores
  • PipPipPip
  • 2.040 mensajes
  • LocationSanto Domingo

Escrito 22 enero 2011 - 10:30

Ahora si me asusté :shocked: , si una mente privilegiada como la tuya no puede con esta consulta, entonces necesito revaluar lo que quiero hacer.  :sad:

Vamos a ver si alguien mas se anima a dar ideas. (li)
  • 0

#10 Delphius

Delphius

    Advanced Member

  • Administrador
  • 6.295 mensajes
  • LocationArgentina

Escrito 22 enero 2011 - 10:37

Estoy casi seguro de que si se puede. Mi problema es que el bosque me tapa el árbol y todavía me pierdo en la consulta y la relación entre las tablas.

La otra posibilidad que estuve barajando es la hacer un SP que genere los datos a mostrar a partir de la consulta. Es decir, se iría recorriendo registro a registro comprobando si corresponde mostrarlo o no (espero que se entienda  :( ) pero me parece un desperdicio ya que seguramente se puede hacer por una vía tradicional (una consulta).

Saludos,
  • 0

#11 Delphius

Delphius

    Advanced Member

  • Administrador
  • 6.295 mensajes
  • LocationArgentina

Escrito 22 enero 2011 - 11:08

¿Te molesta si soy insistente y te pido que me indiques que campos pertenecen a cada tabla y como están relacionadas?

¿Y si a lo mejor partimos la consulta y analizamos el problema por partes hasta llegar al resultado?

Saludos,
  • 0

#12 luk2009

luk2009

    Advanced Member

  • Moderadores
  • PipPipPip
  • 2.040 mensajes
  • LocationSanto Domingo

Escrito 22 enero 2011 - 11:29

DELPHIUS no tengo problema en mostrarte todas las tablas, pero eso va a confundir mas el asunto. Por ahora me interesa realizar esta consulta con una sola tabla, como te describo en el ejemplo anterior y si funciona asi, pues con eso seria suficiente para mi.

podemos llevar esto a una sola tabla que tenga por ejemplo 5 campos

numero  fecha            cliente  evento    estatus
100001  15/01/2010    0001    BA01      PENDIENTE
100002  15/01/2010    0001    BA01      PENDIENTE
100005  15/01/2010    0001    BA01      PENDIENTE
100020  15/01/2010    0001    BA01      PENDIENTE
100025  15/01/2010    0021    MA01      PENDIENTE
100028  15/01/2010    0021    MA01      PENDIENTE
100041  15/01/2010    0001    MA01      PENDIENTE

Quiero que se vea:

numero  fecha            cliente  evento    estatus
100001  15/01/2010    0001    BA01      PENDIENTE
100025  15/01/2010    0021    MA01      PENDIENTE
100041  15/01/2010    0001    MA01      PENDIENTE


Esto es solo una tabla sin mas nada.

  • 0

#13 egostar

egostar

    missing my father, I love my mother.

  • Administrador
  • 14.448 mensajes
  • LocationMéxico

Escrito 23 enero 2011 - 08:13

Hola Luciano, veo que el asunto es que se repiten algunos registros pero hay dos que considero pueden ser claves CLIENTE y EVENTO, porque no haces un GROUP BY por esos campos agregando un SUM(EVENTO) por ejemplo (aunque no lo muestres en el grid) y con eso tendrías agrupados los registros.

Por otro lado, yo creo que sin conocer por lo menos la estructura de las tablas es dificil dar una respuesta acertada, es necesario hacer algunas pruebas para poder llegar a una solución pero sin mas información me parece un poco digamos complicado.

Salud OS
  • 0

#14 Caral

Caral

    Advanced Member

  • Moderador
  • PipPipPip
  • 4.266 mensajes
  • LocationCosta Rica

Escrito 23 enero 2011 - 08:42

Hola
Creo que la clave esta en que se quieren ver solo algunos registros (que no se repitan), pero:
Al haber varios registros que se repiten (campo numero) el efecto del DISTINCT no funciona si no se le da otro argumento.
En este caso se requiere (segun la muestra) que el campo numero a mostrar en la consulta sea el minimo o mas pequeño.

numero  fecha            cliente  evento    estatus
100001  15/01/2010    0001    BA01      PENDIENTE
100025  15/01/2010    0021    MA01      PENDIENTE
100041  15/01/2010    0001    MA01      PENDIENTE


EN FIREBIRD se haria asi:


delphi
  1. IBQuery1.SQL.Add(' SELECT DISTINCT Cliente, Evento, Min(Numero) AS Numero, Fecha, estatus FROM TuTabla');
  2. IBQuery1.SQL.Add(' WHERE estatus = ''PENDIENTE'' ');
  3. IBQuery1.SQL.Add(' GROUP BY Cliente, Evento, Fecha, estatus ');
  4. IBQuery1.SQL.Add(' ORDER BY Cliente, Evento');
  5. IBQuery1.Open;



Con esto el distinct si actua ya que se le da un argumento MIN() entonces se reduce la lista a un registro (en este caso el campo Numero) y como se quiere se visualizan todos los campos.

Hay que darse cuenta de que el DISTINCT lo que hace en esta consulta es definir solo un tipo de cada campo en este caso Cliente y evento, esto hace que no se repitan en la lista a mostrar.
Por otro lado MIN() lo que hace es lo mismo que el Distinct agrupando el campo NUMERO a un solo registro.
Entonces si tenemos solo un registro de Cliente, evento y numero la consulta se ejecuta como la requieres.
Podria darse el caso de necesitar que el campo fecha se ajuste a esto, seria cuestion de probar, tanto con Min() o con Max(), en ese campo.
Saludos
  • 0

#15 luk2009

luk2009

    Advanced Member

  • Moderadores
  • PipPipPip
  • 2.040 mensajes
  • LocationSanto Domingo

Escrito 23 enero 2011 - 09:01

Creo que Caral tiene razon, solo me hace falta ponerle un min o un max a los campos que no se repiten y agrupar por los otros. Creo que nisiquiera hace falta el distinct ya que estoy agrupando por evento y con eso ya es suficiente.

Voy a realizar las pruebas y les aviso como me fue.
  • 0

#16 Caral

Caral

    Advanced Member

  • Moderador
  • PipPipPip
  • 4.266 mensajes
  • LocationCosta Rica

Escrito 23 enero 2011 - 09:10

Hola
Cuando se usa DISTINCT, MIN(), MAX() u otra condicion que genere solo un registro siempre se necesita saber que otros registros NO cumpliran ese criterio ya que estos SI se repetiran.
Para evitar que se repitan se necesita modificar tambien esos registros.
Si usas solo MIN() o MAX(), te pasara lo mismo que solo usar DISTINCT, hay que usar los necesarios, por lo menos en esta consulta.
Saludos
  • 0

#17 Caral

Caral

    Advanced Member

  • Moderador
  • PipPipPip
  • 4.266 mensajes
  • LocationCosta Rica

Escrito 23 enero 2011 - 09:24

Hola
Yo pase por algo similar en una consulta donde tuve que usar distinct, Max y Sum en la misma:


delphi
  1.         QRBancoGen.ADOQuery1.SQL.Add(' SELECT DISTINCT BancoNac.CodTransac,  Max(BancoNac.IdTramsac) AS UltimoDeIdTramsac, BancoNac.TipoTransac, '+
  2.                                       ' BancoNac.FechaTransac, BancoNac.Descripcion, '+
  3.                                       ' Sum(BancoNac.Retiros) AS SumaDeRetiros, Sum(BancoNac.Depositos) AS SumaDeDepositos, '+
  4.                                       '  Max(BancoNac.SaldoTotal) AS SaldoTotal FROM BancoNac ');
  5.         QRBancoGen.ADOQuery1.SQL.Add(' WHERE BancoNac.FechaTransac >= :fech1 AND  BancoNac.FechaTransac <= :fech2');
  6.         QRBancoGen.ADOQuery1.SQL.Add(' GROUP BY BancoNac.CodTransac, BancoNac.TipoTransac, BancoNac.FechaTransac, BancoNac.Descripcion ');
  7.         QRBancoGen.ADOQuery1.SQL.Add(' ORDER BY Max(BancoNac.IdTramsac), BancoNac.FechaTransac ASC');
  8.         QRBancoGen.ADOQuery1.Params[0].Value:= DateToStr(DTP1.Date);
  9.         QRBancoGen.ADOQuery1.Params[1].Value:= DateToStr(DTP2.Date);
  10.         QRBancoGen.ADOQuery1.Open;


Y funciona perfectamente  (h) :)
Saludos
  • 0

#18 luk2009

luk2009

    Advanced Member

  • Moderadores
  • PipPipPip
  • 2.040 mensajes
  • LocationSanto Domingo

Escrito 23 enero 2011 - 09:25

Pues de esta forma funciona


sql
  1. SELECT cliente,evento, MIN(FECHA) AS FECH,MIN(numero) AS NUM,estatus
  2. FROM activas WHERE estatus<>'COMPLETADA'
  3. GROUP BY  csid,evento,estatus
  4. ORDER BY NUM



Ahora solo tengo que hacer la adaptacion al query original y con las tablas originales y talvez utilizar dos querys como me sugeriste alguna vez.
  • 0

#19 luk2009

luk2009

    Advanced Member

  • Moderadores
  • PipPipPip
  • 2.040 mensajes
  • LocationSanto Domingo

Escrito 23 enero 2011 - 09:37

Caral talvez la diferencia es que en mi caso yo quiero repetir los clientes pero que tengan un evento diferente, es decir
puede haber un:
0001 BA02
0001 BA03



  • 0

#20 Delphius

Delphius

    Advanced Member

  • Administrador
  • 6.295 mensajes
  • LocationArgentina

Escrito 24 enero 2011 - 08:56

Hola,
¿Al final está resuelto?  :huh:

Yo estuve un rato comiéndome cabeza y no había caso. No logro dar con la solución.

Lo que estuve pensando, que quizá sea lo más adecuado, es disponer de un SP que se encargue de generar el conjunto de datos. La idea sería que el SP ejecutase una consulta para extraer los clientes.

Por cada cliente, se genera una segunda consulta a fin de devolver todas las activaciones con el evento. De esta segunda consulta se va evaluando, registro a registro si el evento en cuestión es "distinto" del anterior. De ser así se añade al conjunto de datos que regresa el SP.

Espero que se entienda...

Entonces, sería algo como:

1) Extraer todos los clientes
2) Por cada cliente:
2.1) Consultar activaciones y eventos
2.2) Por cada registro de la consulta:
si evento <> eventoanterior entonces:
2.2.1). Añadir registro al conjunto de datos de SP
2.2.2). eventoanterior = evento

Saludos,
  • 0




IP.Board spam blocked by CleanTalk.