Jump to content


Photo

Consulta SQL


  • Please log in to reply
4 replies to this topic

#1 luk2009

luk2009

    Advanced Member

  • Moderadores
  • PipPipPip
  • 2040 posts
  • LocationSanto Domingo

Posted 26 May 2009 - 10:26 PM



sql
  1. SELECT    ACMSUB.CSID, ACMSUB.CLIENTES, COUNT(evento.TIPO) AS DISPAROS, evento.Evento, evento.Detalle
  2.  
  3. FROM        CENTRAL INNER JOIN
  4.                       ACMSUB ON CENTRAL.CSID = ACMSUB.CSID INNER JOIN
  5.                       evento ON CENTRAL.EVENTO = evento.Evento
  6. WHERE    (evento.Evento LIKE 'BA%' OR evento.Evento LIKE '1%') AND FECHAN >'20090520'
  7.  
  8. GROUP BY ACMSUB.CSID, ACMSUB.CLIENTES, evento.Evento, evento.Detalle
  9.  
  10. HAVING      (COUNT(evento.TIPO) > 3)
  11.  
  12. ORDER BY ACMSUB.CSID



Mi programa recibe datos desde el puerto serial, los cuales tienen relacion con sistemas de alarmas residenciales y los guarda en una base de datos sql server 2000
En esta consulta utilizo tres tablas:
1.- ACMSUB  que la tabla de los clientes
2.- CENTRAL  que se encarga de archivar todos los datos del puerto serial
3.- EVENTO  que se encarga de definir que significa cada dato archivado en la tabla central

Con esta consulta logro que me diga si en una casa la alarma ha sonado en mas de tres ocasiones desde una fecha X hasta el dia actual. Hasta hay todo bien, Solo que deseo que cuente las alarmas que han sonado solo si esto ha pasado en dias diferentes. 
Ejemplo:
0225  BA01  robo zona 1    25/05/2009  10:00 AM
0225  BA01  robo zona 1    25/05/2009  04:05 PM
0225  BA01  robo zona 1    26/05/2009  11:25 AM
0225  BA01  robo zona 1    26/05/2009  09:22 PM
0225  BA01  robo zona 1    29/05/2009  08:05 PM

La cuenta me daria ahora  5 disparos de alarma y quiero que solo me sume uno por dia y que el conteo de 3
Espero haberme explicado bien. Cualquier idea sera bien recibida





  • 0

#2 poliburro

poliburro

    Advanced Member

  • Administrador
  • 4945 posts
  • LocationMéxico

Posted 27 May 2009 - 09:07 AM



sql
  1.       SELECT ACMSUB.CSID, ACMSUB.CLIENTES, DISPAROS, evento.Evento, evento.Detalle
  2.         FROM Central AS Central
  3.   INNER JOIN AcmSub AS AcmSub
  4.             ON Central.Csid = AcmSub.CsId
  5.   INNER JOIN (       
  6.                         SELECT EveCont.Evento, EveCont.Detalle,
  7.                                   COUNT( DISTINCT CONVERT(VARCHAR(10),EveCont.FechAn,121) ) AS Disparos
  8.                           FROM Evento AS EveCont
  9.                         WHERE (EveCont.Evento LIKE 'BA%' OR EveCont.Evento LIKE '1%') AND
  10.                                   EveCont.FechAn > '20090520'
  11.                     GROUP BY EveCont.Evento, EveCont.Detalle
  12.                         HAVING COUNT( DISTINCT CONVERT(VARCHAR(10),EveCont.FechAn,121) ) > 3
  13.                   ) AS Evento
  14.             ON Central.Evento = Evento.Evento


  • 0

#3 luk2009

luk2009

    Advanced Member

  • Moderadores
  • PipPipPip
  • 2040 posts
  • LocationSanto Domingo

Posted 27 May 2009 - 10:22 AM

gracias por tu respuesta, pero si me la explicas te lo agradeceria mucho, ya que me da un error, porque que el campo fechan pertenece a la tabla central y no a la evento. Pero explicame la idea para ver que puedo hacer.
Gracias de nuevo.
  • 0

#4 poliburro

poliburro

    Advanced Member

  • Administrador
  • 4945 posts
  • LocationMéxico

Posted 27 May 2009 - 10:38 AM

gracias por tu respuesta, pero si me la explicas te lo agradeceria mucho, ya que me da un error, que el campo fechan pertenece a la tabla central y no a la evento. Pero explicame la idea para ver que puedo hacer.
Gracias de nuevo.



El error es por que FechAn está en Central, como no conozco tus tablas inferí­ que era parte de eventos :p. pero ok, vayamos por partes.


Tu requieres saber cuantas incidencias hay en un periodo de tiempo, pero cada registro se guarda con la hora. Por lo tanto debes primero discriminar los eventos repetidos para obtener eventos únicos por fecha, Una manera de hacerlo serí­a primero obtener las incidencias para cada dí­a en el periodo:



sql
  1.         SELECT EveCont.Evento, EveCont.Detalle,
  2.                   CONVERT(VARCHAR(10),EveCont.FechAn,121) AS Fecha, COUNT(*) CuantosPorFecha
  3.       FROM Evento AS EveCont
  4.   INNER JOIN Central AS Central
  5.             ON  Central.FechAn > '20090520' AND
  6.                   (EveCont.Evento LIKE 'BA%' OR EveCont.Evento LIKE '1%') AND
  7.                   ON Central.Evento = Evento.Evento
  8. GROUP BY EveCont.Evento, EveCont.Detalle, CONVERT(VARCHAR(10),Central.FechAn,121)



Como realmente no necesitas saber cuantos por dí­a sino cuantos en el periodo, procederemos a hacer otra agrupación pero ahora por evento




sql
  1. SELECT EveCont.Evento, EveCont.Detalle, COUNT(*) AS CuantosEnPeriodo
  2.       FROM (
  3.         SELECT EveCont.Evento, EveCont.Detalle,
  4.                   CONVERT(VARCHAR(10),EveCont.FechAn,121) AS Fecha, COUNT(*) CuantosPorFecha
  5.       FROM Evento AS EveCont
  6.   INNER JOIN Central AS Central
  7.             ON  Central.FechAn > '20090520' AND
  8.                   (EveCont.Evento LIKE 'BA%' OR EveCont.Evento LIKE '1%') AND
  9.                   ON Central.Evento = Evento.Evento
  10. GROUP BY EveCont.Evento, EveCont.Detalle, CONVERT(VARCHAR(10),Central.FechAn,121)
  11.               ) AS Datos
  12.     GROUP BY Datos.Evento, Datos.Detalle
  13.       HAVING COUNT(*) > 3



De esta manera cuentas cuantas repeticiones hay por evento y sabrás cuantos son mayor a 3.


En la primera consulta lo que hice fué más o menos lo mismo convertí­ la fecha a un varchar de 10 para tener solo la parte de fecha del campo, y de esa manera poder agrupar por este. Al realizar el count apliqué un distinct para que los repetidos se contaran como solo uno.

Espero esto haya aclarado un poco más tu pregunta, Si no, con la confianza del mundo puedes continuar preguntando

  • 0

#5 luk2009

luk2009

    Advanced Member

  • Moderadores
  • PipPipPip
  • 2040 posts
  • LocationSanto Domingo

Posted 27 May 2009 - 11:39 PM



sql
  1. SELECT ACMSUB.CSID, ACMSUB.CLIENTES, COUNT(evento.Evento) AS DISPAROS, evento.Evento, evento.Detalle, COUNT(DISTINCT CONVERT(VARCHAR(10), CENTRAL.fechan,121)) AS DIASDISPAROS
  2.  
  3. FROM  CENTRAL INNER JOIN ACMSUB ON CENTRAL.CSID = CMSUB.CSID INNER JOIN  evento ON CENTRAL.EVENTO = evento.Evento
  4.  
  5. WHERE  (evento.Evento LIKE 'BA%' OR evento.Evento LIKE '1%') AND (CENTRAL.fechan > '20090524')
  6.  
  7. GROUP BY ACMSUB.CSID, ACMSUB.CLIENTES, evento.Evento, evento.Detalle
  8.  
  9. HAVING (COUNT(evento.Evento) > 1) AND (COUNT(DISTINCT CONVERT(VARCHAR(10), CENTRAL.fechan, 121)) > 1)
  10.  
  11. ORDER BY ACMSUB.CSID



asi quedo la consulta y ya puedo saber cuantas alarmas hubo donde un cliente y ademas cuantos dias tiene haciendolo.

gracias de nuevo


  • 0




IP.Board spam blocked by CleanTalk.