none
agrupar por rango de horas RRS feed

  • Pregunta

  • Hola amigos tengo una consulta, necesito sacar un reporte pero agrupado por rango de horas, tengo los siguientes datos y hay que agruparlos  por user, por fecha y el detalle esta que debe estar agrupado por horas 

    contacto           estatus user fecha_llamada duración
    NULL Overflow NULL 2012-05-14 06:26:35.000 NULL
    11719424 Handled/Atendidas 829 2012-05-14 06:37:48.000 3910
    11719441 Handled/Atendidas 822 2012-05-14 06:38:01.000 5780
    11719480 Handled/Atendidas 830 2012-05-14 06:42:21.000 10450
    11719500 Handled/Atendidas 824 2012-05-14 06:54:49.000 5520
    NULL Abandoned/Abandonadas 821 2012-05-14 07:01:05.000 340
    NULL Handled/Atendidas 827 2012-05-14 06:45:40.000 17910

    tendría que tener un resultado como el que sigue agrupado por user y rango horas total de llamadas atendidas, tiempo total de llamadas

    horas 9:00 - 10:00                          :         10:00 - 11:00       :        11:00 - 12:00....
    user       atendidas : tiempo llamada      atendidas : tiempo llamada     atendidas : tiempo llamada 
    829               15          1200s      9           915s                     11   1080s
    .
    .
    .
    .
    .

    ojala me apoyen con este tema no se como hacerlo espero me ayuden

    Saludos

    jueves, 17 de mayo de 2012 23:33

Respuestas

  • Si nos pones la consulta que estás lanzando te podríamos ayudar mejor, has probado la función datepart?

    Podría ser algo parecido a esto:

    SELECT contacto, 
    (select count(fecha_llamada) from fechas f2 where datepart(hour,fecha_llamada) = '06' and f1.contacto=f2.contacto) 'Atendidas 06:00 -07:00',
    (select avg(duracion) from fechas f2 where datepart(hour,fecha_llamada) = '06' and f1.contacto=f2.contacto) 'Duracion_Media 06:00 -07:00',
    (select count(fecha_llamada) from fechas f2 where datepart(hour,fecha_llamada) = '07' and f1.contacto=f2.contacto) 'Atendidas 07:00 -08:00',
    (select avg(duracion) from fechas f2 where datepart(hour,fecha_llamada) = '07' and f1.contacto=f2.contacto) 'Duracion_Media 07:00 -08:00',
    (select count(fecha_llamada) from fechas f2 where datepart(hour,fecha_llamada) = '08' and f1.contacto=f2.contacto) 'Atendidas 08:00 -09:00',
    (select avg(duracion) from fechas f2 where datepart(hour,fecha_llamada) = '08' and f1.contacto=f2.contacto) 'Duracion_Media 08:00 -09:00'
    from fechas f1
    group BY contacto

    y el resultado sería:

    Si tienes dudas de como hacerlo, pon tu consulta y te ayudamos

    un Saludo


    Fran Lens http://es.linkedin.com/in/franlens
    My Blog: http://www.lensql.net

    Please remember click the Mark as Answer button if a post helps you to solve the problem


    • Editado Fran Lens viernes, 18 de mayo de 2012 8:39
    • Marcado como respuesta richardc81 martes, 22 de mayo de 2012 0:58
    viernes, 18 de mayo de 2012 8:33

Todas las respuestas

  • Si nos pones la consulta que estás lanzando te podríamos ayudar mejor, has probado la función datepart?

    Podría ser algo parecido a esto:

    SELECT contacto, 
    (select count(fecha_llamada) from fechas f2 where datepart(hour,fecha_llamada) = '06' and f1.contacto=f2.contacto) 'Atendidas 06:00 -07:00',
    (select avg(duracion) from fechas f2 where datepart(hour,fecha_llamada) = '06' and f1.contacto=f2.contacto) 'Duracion_Media 06:00 -07:00',
    (select count(fecha_llamada) from fechas f2 where datepart(hour,fecha_llamada) = '07' and f1.contacto=f2.contacto) 'Atendidas 07:00 -08:00',
    (select avg(duracion) from fechas f2 where datepart(hour,fecha_llamada) = '07' and f1.contacto=f2.contacto) 'Duracion_Media 07:00 -08:00',
    (select count(fecha_llamada) from fechas f2 where datepart(hour,fecha_llamada) = '08' and f1.contacto=f2.contacto) 'Atendidas 08:00 -09:00',
    (select avg(duracion) from fechas f2 where datepart(hour,fecha_llamada) = '08' and f1.contacto=f2.contacto) 'Duracion_Media 08:00 -09:00'
    from fechas f1
    group BY contacto

    y el resultado sería:

    Si tienes dudas de como hacerlo, pon tu consulta y te ayudamos

    un Saludo


    Fran Lens http://es.linkedin.com/in/franlens
    My Blog: http://www.lensql.net

    Please remember click the Mark as Answer button if a post helps you to solve the problem


    • Editado Fran Lens viernes, 18 de mayo de 2012 8:39
    • Marcado como respuesta richardc81 martes, 22 de mayo de 2012 0:58
    viernes, 18 de mayo de 2012 8:33
  • Como dice Fran, la clave está en 

    datepart(hour,fecha_llamada)

    y como quieres agrupar por ese dato, tan sencillo como

    SELECT .....

    FROM ....

    GROUP BY datepart(hour,fecha_llamada)


    • Propuesto como respuesta Marcel Masplà viernes, 18 de mayo de 2012 9:59
    viernes, 18 de mayo de 2012 9:59
  • Marcel, si en el select no pones también datepart, no te permite agrupar por ello, en todo caso sería:

    SELECT datepart(hour,fecha_llamada)
    
    FROM ....
    
    GROUP BY datepart(hour,fecha_llamada)



    Fran Lens http://es.linkedin.com/in/franlens
    My Blog: http://www.lensql.net

    Please remember click the Mark as Answer button if a post helps you to solve the problem

    lunes, 21 de mayo de 2012 7:04
  • Solo un detalle, al poner una función tipo datepart al predicado fecha_llamada, es posible que dejen de usarse índices que podrían usarse si se hacen comparaciones del tipo >= y <=, ahora mismo no puedo explicarlo con detalle, pero intentaré que sea un post en mi blog, que ya lleva demasiado sin actualizar.

    Comparte lo que sepas, aprende lo que no sepas (FGG)
    portalSQL
    El rincón del DBA

    lunes, 21 de mayo de 2012 7:38
    Moderador
  • Gracias Fran Lens trate de acondicionar el query a la idea k me diste y si me realizo la consulta pero los numeros no fueron los correctos ya que se incremetaban demasiado al final solo use un sum con el datepart y asi me quedo la consulta

    SELECT e_user as AGENTE, 
    SUM(CASE WHEN termination_status = 1 and datepart(hour,start_time) = '06' THEN 1 ELSE 0 END) AS "atendidas 06:00-07:00",
    SUM(CASE WHEN termination_status = 1 and datepart(hour,start_time) = '06' THEN duration END) AS "Duracion 06:00-07:00",
    SUM(CASE WHEN termination_status = 1 and datepart(hour,start_time) = '07' THEN 1 ELSE 0 END) AS "atendidas 07:00-08:00",
    SUM(CASE WHEN termination_status = 1 and datepart(hour,start_time) = '07' THEN duration END) AS "Duracion 07:00-08:00",
    SUM(CASE WHEN termination_status = 1 and datepart(hour,start_time) = '08' THEN 1 ELSE 0 END) AS "atendidas 08:00-09:00",
    SUM(CASE WHEN termination_status = 1 and datepart(hour,start_time) = '08' THEN duration END) AS "Duracion 08:00-09:00",
    SUM(CASE WHEN termination_status = 1 and datepart(hour,start_time) = '09' THEN 1 ELSE 0 END) AS "atendidas 09:00-10:00",
    SUM(CASE WHEN termination_status = 1 and datepart(hour,start_time) = '09' THEN duration END) AS "Duracion 09:00-10:00",
    SUM(CASE WHEN termination_status = 1 and datepart(hour,start_time) = '10' THEN 1 ELSE 0 END) AS "atendidas 10:00-11:00",
    SUM(CASE WHEN termination_status = 1 and datepart(hour,start_time) = '10' THEN duration END) AS "Duracion 10:00-11:00",
    SUM(CASE WHEN termination_status = 1 and datepart(hour,start_time) = '11' THEN 1 ELSE 0 END) AS "atendidas 11:00-12:00",
    SUM(CASE WHEN termination_status = 1 and datepart(hour,start_time) = '11' THEN duration END) AS "Duracion 11:00-12:00",
    SUM(CASE WHEN termination_status = 1 and datepart(hour,start_time) = '12' THEN 1 ELSE 0 END) AS "atendidas 12:00-13:00",
    SUM(CASE WHEN termination_status = 1 and datepart(hour,start_time) = '12' THEN duration END) AS "Duracion 12:00-13:00",
    SUM(CASE WHEN termination_status = 1 and datepart(hour,start_time) = '13' THEN 1 ELSE 0 END) AS "atendidas 13:00 -14:00",
    SUM(CASE WHEN termination_status = 1 and datepart(hour,start_time) = '13' THEN duration END) AS "Duracion 13:00-14:00",
    SUM(CASE WHEN termination_status = 1 and datepart(hour,start_time) = '14' THEN 1 ELSE 0 END) AS "atendidas 14:00-15:00",
    SUM(CASE WHEN termination_status = 1 and datepart(hour,start_time) = '14' THEN duration END) AS "Duracion 14:00-15:00",
    SUM(CASE WHEN termination_status = 1 and datepart(hour,start_time) = '15' THEN 1 ELSE 0 END) AS "atendidas 15:00 -16:00",
    SUM(CASE WHEN termination_status = 1 and datepart(hour,start_time) = '15' THEN duration END) AS "Duracion 15:00-16:00",
    SUM(CASE WHEN termination_status = 1 and datepart(hour,start_time) = '16' THEN 1 ELSE 0 END) AS "atendidas 16:00 -17:00",
    SUM(CASE WHEN termination_status = 1 and datepart(hour,start_time) = '16' THEN duration END) AS "Duracion 16:00-17:00",
    SUM(CASE WHEN termination_status = 1 THEN 1 ELSE 0 END) AS "total atendidas",
    sum(convert(int,right(left(ltrim(rtrim(duration)),len(ltrim(rtrim(duration)))-1),len(ltrim(rtrim(duration)))-1)))-10 as "Tiempo Total/Segundos"
    FROM easy..vReporteInteracciones x
    where x.campaign = 36 and convert(datetime,convert(varchar(20),x.start_time,102),111)>= '14/05/2012' and convert(datetime,convert(varchar(20),x.start_time,102),111) <= '21/05/2012'
    GROUP BY e_user 

    quería colocar la imagen de la respuesta pero no se como hacerlo, la cosa es que salio con el resultado esperado. muchas gracias a todos por el apoyo

    martes, 22 de mayo de 2012 1:07