Ir al contenido


Foto

join


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

#1 root

root

    mister

  • Miembro Platino
  • PipPipPip
  • 529 mensajes
  • LocationMexico D.F:

Escrito 08 abril 2010 - 12:40

saludos Sres
ustedes que le saben mas denme u nore de por donde esta el error en mi consulta pls


sql
  1. (SELECT
  2. DATE_FORMAT(cdr.calldate,concat('%d %M %Y')) AS fecha,
  3. mike.ext
  4. FROM
  5. cdr
  6.  
  7. LEFT JOIN (
  8. SELECT
  9. DATE_FORMAT(cdr.calldate,concat('%d %M %Y')) AS fecha,
  10. COUNT(cdr.dstchannel) AS ext
  11. FROM cdr
  12. WHERE
  13. YEAR(cdr.calldate) = 2010
  14. AND
  15. MONTH(cdr.calldate) =  3
  16. AND
  17. cdr.disposition = 'ANSWERED'
  18. AND
  19. cdr.duration > 60
  20. AND
  21. cdr.dstchannel LIKE 'SIP/102%'
  22. GROUP BY
  23. fecha
  24.  
  25. ORDER BY
  26. fecha ASC
  27. )AS mike
  28. ON consulta.fecha = mike.fecha
  29.  
  30.  
  31. WHERE
  32. YEAR(cdr.calldate) = 2010
  33. AND
  34. MONTH(cdr.calldate) =  3
  35. AND
  36. cdr.disposition = 'ANSWERED'
  37. AND
  38. cdr.duration > 60
  39. GROUP BY
  40. fecha
  41. ORDER BY
  42. fecha ASC
  43. )AS consulta




GRACIAS DE ANTE MANO
  • 0

#2 egostar

egostar

    missing my father, I love my mother.

  • Administrador
  • 14.257 mensajes
  • LocationMéxico

Escrito 08 abril 2010 - 12:46

Yo creo que el problema esta en que quieres regresar dos valores en el join (select fecha, ext..... ) as mike, porque mejor no usas una vista y haces el join sobre ella.

Salud OS
  • 0

#3 kafastoforman

kafastoforman

    Advanced Member

  • Miembro Platino
  • PipPipPip
  • 277 mensajes
  • LocationMexico D.F.

Escrito 08 abril 2010 - 01:11

Que tal root, he indentado un poco la consulta para que yo pueda entenderla mejor, y te pongo en comentarios mis observaciónes.



sql
  1. SELECT DATE_FORMAT(cdr.calldate,concat('%d %M %Y')) AS fecha, mike.ext
  2. FROM cdr
  3. LEFT JOIN (SELECT DATE_FORMAT(cdr.calldate,concat('%d %M %Y')) AS fecha,
  4.   COUNT(cdr.dstchannel) AS ext
  5. FROM cdr
  6. WHERE YEAR(cdr.calldate) = 2010
  7. AND MONTH(cdr.calldate) =  3
  8. AND cdr.disposition = 'ANSWERED'
  9. AND cdr.duration > 60
  10. AND cdr.dstchannel LIKE 'SIP/102%'
  11. GROUP BY fecha
  12. ORDER BY fecha ASC)AS mike
  13. ON consulta.fecha = mike.fecha --> aqui deseas unir un campo que todavia no existe
  14.                                           --> ya que tu union tendria que ser con cdr la cual
  15.                                           --> es tu tabla principal por lo tanto aqui puede
  16.                                           --> arrojar un erro
  17. WHERE YEAR(cdr.calldate) = 2010
  18. AND MONTH(cdr.calldate) =  3
  19. AND cdr.disposition = 'ANSWERED'
  20. AND cdr.duration > 60
  21. GROUP BY fecha
  22. ORDER BY fecha ASC
  23. )AS consulta



Ahora de acuerdo a lo que creo que deseas podria quedar de esta manera



sql
  1. SELECT DATE_FORMAT(cdr.calldate,concat('%d %M %Y')) AS fecha,
  2.   COUNT(cdr.dstchannel) AS ext
  3. FROM cdr
  4. WHERE YEAR(cdr.calldate) = 2010
  5. AND MONTH(cdr.calldate) =  3
  6. AND cdr.disposition = 'ANSWERED'
  7. AND cdr.duration > 60
  8. AND cdr.dstchannel LIKE 'SIP/102%'
  9. WHERE YEAR(cdr.calldate) = 2010
  10. AND MONTH(cdr.calldate) =  3
  11. AND cdr.disposition = 'ANSWERED'
  12. AND cdr.duration > 60
  13. GROUP BY fecha
  14. ORDER BY fecha ASC




Saludos
  • 0

#4 root

root

    mister

  • Miembro Platino
  • PipPipPip
  • 529 mensajes
  • LocationMexico D.F:

Escrito 08 abril 2010 - 01:47

de hecho

es una consulta a una base de datos de asterisk ( trixbox )

y el motivo de hacer el join
es por que de momento solo estoy haciendo la consulta de la ext 102

necesito de las extensiones
102
103
104
106
107
108

pensaa hacer varias veces el join

y lo que necesito es un conteo de las lllamadas contestadas


sql
  1. cdr.disposition = 'ANSWERED'


que tengas duracion de mas de 60 segundos


sql
  1. cdr.duration > 60



y que esten en un rango de fechas

ocupo la funcion year y mont para poder cambiarlo rapido al sacar los reportes mes a mes

y con lo que mencionava EGOSTAR

no puedo referirme a
CRD.FECHA

o si ??

por que dejaria de agruparmelos por dia por mes



  • 0

#5 root

root

    mister

  • Miembro Platino
  • PipPipPip
  • 529 mensajes
  • LocationMexico D.F:

Escrito 08 abril 2010 - 01:49

correcion

si se puede


sql
  1. SELECT
  2. DATE_FORMAT(cdr.calldate,concat('%d %M %Y')) AS fecha,
  3. mike.ext
  4. FROM
  5. cdr
  6.  
  7. LEFT JOIN (
  8. SELECT
  9. DATE_FORMAT(cdr.calldate,concat('%d %M %Y')) AS fecha,
  10. COUNT(cdr.dstchannel) AS ext
  11. FROM cdr
  12. WHERE
  13. YEAR(cdr.calldate) = 2010
  14. AND
  15. MONTH(cdr.calldate) =  3
  16. AND
  17. cdr.disposition = 'ANSWERED'
  18. AND
  19. cdr.duration > 60
  20. AND
  21. cdr.dstchannel LIKE 'SIP/102%'
  22. GROUP BY
  23. fecha
  24.  
  25. ORDER BY
  26. fecha ASC
  27. )AS mike
  28. ON cdr.calldate = cdr.calldate
  29.  
  30.  
  31. WHERE
  32. YEAR(cdr.calldate) = 2010
  33. AND
  34. MONTH(cdr.calldate) =  3
  35. AND
  36. cdr.disposition = 'ANSWERED'
  37. AND
  38. cdr.duration > 60
  39. GROUP BY
  40. fecha
  41. ORDER BY
  42. fecha ASC



este es el resutado

01 March 2010 29
01 March 2010 27
01 March 2010 31
01 March 2010 22
01 March 2010 20
01 March 2010 14
01 March 2010 34
01 March 2010 50
01 March 2010 68
01 March 2010 60
01 March 2010 77
01 March 2010 63
01 March 2010 61
01 March 2010 53
01 March 2010 41
01 March 2010 78
01 March 2010 106
01 March 2010 34
01 March 2010 35
01 March 2010 31
01 March 2010 59
01 March 2010 45
01 March 2010 38
01 March 2010 33


  • 0

#6 root

root

    mister

  • Miembro Platino
  • PipPipPip
  • 529 mensajes
  • LocationMexico D.F:

Escrito 08 abril 2010 - 01:57

pero por que si agrego otro join la cosa se descompone :s


sql
  1. SELECT
  2. DATE_FORMAT(cdr.calldate,concat('%d %M %Y')) AS fecha,
  3. mike.ext,
  4. gloria.ext
  5. FROM
  6. cdr
  7.  
  8. LEFT JOIN (
  9. SELECT
  10. DATE_FORMAT(cdr.calldate,concat('%d %M %Y')) AS fecha,
  11. COUNT(cdr.dstchannel) AS ext
  12. FROM cdr
  13. WHERE
  14. YEAR(cdr.calldate) = 2010
  15. AND
  16. MONTH(cdr.calldate) =  3
  17. AND
  18. cdr.disposition = 'ANSWERED'
  19. AND
  20. cdr.duration > 60
  21. AND
  22. cdr.dstchannel LIKE 'SIP/102%'
  23. GROUP BY
  24. fecha
  25.  
  26. ORDER BY
  27. fecha ASC
  28. )AS mike
  29. ON cdr.calldate = cdr.calldate
  30.  
  31.  
  32. LEFT JOIN (
  33. SELECT
  34. DATE_FORMAT(cdr.calldate,concat('%d %M %Y')) AS fecha,
  35. COUNT(cdr.dstchannel) AS ext
  36. FROM cdr
  37. WHERE
  38. YEAR(cdr.calldate) = 2010
  39. AND
  40. MONTH(cdr.calldate) =  3
  41. AND
  42. cdr.disposition = 'ANSWERED'
  43. AND
  44. cdr.duration > 60
  45. AND
  46. cdr.dstchannel LIKE 'SIP/103%'
  47. GROUP BY
  48. fecha
  49.  
  50. ORDER BY
  51. fecha ASC
  52. )AS gloria
  53. ON cdr.calldate = cdr.calldate
  54.  
  55.  
  56. WHERE
  57. YEAR(cdr.calldate) = 2010
  58. AND
  59. MONTH(cdr.calldate) =  3
  60. AND
  61. cdr.disposition = 'ANSWERED'
  62. AND
  63. cdr.duration > 60
  64. GROUP BY
  65. fecha
  66. ORDER BY
  67. fecha ASC



la respuesta es

01 March 2010 29 29
02 March 2010 29 29
03 March 2010 29 29
04 March 2010 29 29
05 March 2010 29 29
06 March 2010 29 29
07 March 2010 29 29
08 March 2010 29 29
09 March 2010 29 29
10 March 2010 29 29
11 March 2010 29 29
12 March 2010 29 29
13 March 2010 29 29
14 March 2010 29 29
15 March 2010 29 29
16 March 2010 29 29
17 March 2010 29 29
18 March 2010 29 29
19 March 2010 29 29
20 March 2010 29 29
21 March 2010 29 29
22 March 2010 29 29
23 March 2010 29 29
24 March 2010 29 29
25 March 2010 29 29
26 March 2010 29 29
27 March 2010 29 29
28 March 2010 29 29
29 March 2010 29 29
30 March 2010 29 29
31 March 2010 29 29


alguna sugerencia ???




  • 0

#7 enecumene

enecumene

    Webmaster

  • Administrador
  • 7.409 mensajes
  • LocationRepública Dominicana

Escrito 08 abril 2010 - 02:27

Porque de seguro estás haciendo la unión dos veces con el mismo campo, puede que el problema venga de ahí.

Saludos.
  • 0

#8 poliburro

poliburro

    Advanced Member

  • Administrador
  • 4.945 mensajes
  • LocationMéxico

Escrito 08 abril 2010 - 02:53

Pruieba con esto compañero



sql
  1.   SELECT Uno.Fecha, Uno.Mike, Dos.Gloria
  2.     FROM (
  3.               SELECT DATE_FORMAT(cdr.calldate,concat('%d %M %Y')) AS fecha, mike.ext AS Mike
  4.                 FROM cdr
  5.             LEFT JOIN (  SELECT DATE_FORMAT(cdr.calldate,concat('%d %M %Y')) AS fecha,
  6.                                 COUNT(cdr.dstchannel) AS ext
  7.                           FROM cdr
  8.                           WHERE YEAR(cdr.calldate) = 2010 AND
  9.                                 MONTH(cdr.calldate) =  3  AND
  10.                                 cdr.disposition = 'ANSWERED' AND
  11.                                 cdr.duration > 60 AND
  12.                                 cdr.dstchannel LIKE 'SIP/102%'
  13.                       GROUP BY fecha
  14.                       )AS mike
  15.                   ON cdr.calldate = cdr.calldate
  16.                 WHERE YEAR(cdr.calldate) = 2010 AND
  17.                       MONTH(cdr.calldate) =  3  AND
  18.                       cdr.disposition = 'ANSWERED' AND
  19.                       cdr.duration > 60
  20.             GROUP BY fecha
  21.           ) AS Uno
  22. LEFT JOIN  (
  23.  
  24.               SELECT DATE_FORMAT(cdr.calldate,concat('%d %M %Y')) AS fecha, mike.ext AS Gloria
  25.                 FROM cdr
  26.             LEFT JOIN (  SELECT DATE_FORMAT(cdr.calldate,concat('%d %M %Y')) AS fecha,
  27.                                 COUNT(cdr.dstchannel) AS ext
  28.                           FROM cdr
  29.                           WHERE YEAR(cdr.calldate) = 2010 AND
  30.                                 MONTH(cdr.calldate) =  3  AND
  31.                                 cdr.disposition = 'ANSWERED' AND
  32.                                 cdr.duration > 60 AND
  33.                                 cdr.dstchannel LIKE 'SIP/103%'
  34.                       GROUP BY fecha
  35.                       )AS mike
  36.                   ON cdr.calldate = cdr.calldate
  37.                 WHERE YEAR(cdr.calldate) = 2010 AND
  38.                       MONTH(cdr.calldate) =  3  AND
  39.                       cdr.disposition = 'ANSWERED' AND
  40.                       cdr.duration > 60
  41.             GROUP BY fecha
  42.           ) AS Dos
  43.       ON Uno.Fecha = Dos.Fecha


  • 0

#9 root

root

    mister

  • Miembro Platino
  • PipPipPip
  • 529 mensajes
  • LocationMexico D.F:

Escrito 09 abril 2010 - 09:22

no ps se decompone mas me da un resultado como con 600 campos

creo lo mas sencillo sera hacer las consultas corespondientes a cada extension
pero que me los agrupe y ordene por fechas
donde las llamadas superen los 60 segundos y esten entre un rango de fechas

dejen le pienso y se las pongo para qu eme digan com la ven y quede como referencia para correrla en servidores con asterisk y mysql para hacer reportes o cosas asi


  • 0

#10 kafastoforman

kafastoforman

    Advanced Member

  • Miembro Platino
  • PipPipPip
  • 277 mensajes
  • LocationMexico D.F.

Escrito 09 abril 2010 - 09:53

a ver compañero, intenta con esto



sql
  1. SELECT fecha, ext, COUNT(chn103), COUNT(chn102)
  2. FROM(SELECT DATE_FORMAT(cdr.calldate,concat('%d %M %Y')) AS fecha,
  3. cdr.ext AS ext
  4.       CASE WHEN cdr.dstchanel LIKE 'SIP/103%' THEN 1 ELSE 0 AS chn103,
  5. CASE WHEN cdr.dstchanel LIKE 'SIP/102%' THEN 1 ELSE 0 AS chn102
  6. FROM cdr
  7. WHERE YEAR(cdr.calldate) = 2010 AND
  8.     MONTH(cdr.calldate) =  3  AND
  9.         cdr.disposition = 'ANSWERED' AND
  10.         cdr.duration > 60 AND) AS detalle
  11. GROUP BY fecha, ext;



Saludos

Kafastoforman
  • 0

#11 egostar

egostar

    missing my father, I love my mother.

  • Administrador
  • 14.257 mensajes
  • LocationMéxico

Escrito 09 abril 2010 - 10:24

no ps se decompone mas me da un resultado como con 600 campos

creo lo mas sencillo sera hacer las consultas corespondientes a cada extension
pero que me los agrupe y ordene por fechas
donde las llamadas superen los 60 segundos y esten entre un rango de fechas

dejen le pienso y se las pongo para qu eme digan com la ven y quede como referencia para correrla en servidores con asterisk y mysql para hacer reportes o cosas asi



Que tal amigo, por lo que veo estas intentando obtener un reporte de llamadas por extension, te pongo un ejemplo de un procedimiento almacenado que tengo yo para ese tipo de reportes.



sql
  1. BEGIN
  2.   /* Procedure Text */
  3.   FOR
  4.     SELECT a.Fecha, a.Hora, a.DurEntera, a.Extension, a.Prefijo, a.Numero, a.Ciudad, a.Estado,
  5.           a.SMedido, a.Costo, a.IVA, (a.costo + a.smedido + a.iva) AS total,
  6.           (b.Nombre || ' ' || COALESCE(b.Apellidos, '')) AS usuario FROM LLAMADAS a
  7.     LEFT JOIN extensiones b ON a.extension = b.extension
  8.     WHERE a.fecha >= :E_Inicial AND a.fecha <= :E_Final AND a.tipo = 0
  9.     ORDER BY a.extension, a.fecha, a.hora
  10.   INTO :S_Fecha, :S_Hora, :s_duracion, :S_Extension, :S_Prefijo, :S_Numero, :S_Ciudad,
  11.       :S_Estado, :S_SMedido, :S_Costo, :S_IVA, :S_TOTAL, :S_USUARIO DO
  12.   suspend;
  13. END



Este reporte me muestra la información clasificada por extensión, fecha y hora dentro de un rango de fechas y un ID.

Puedes modificarlo de acuerdo a los campos de tu base de datos.

Salud OS

PD, yo estoy usando Firebird.
  • 0