Foros del Web » Programación para mayores de 30 ;) » Bases de Datos General » SQL Server »

Query SQLserver

Estas en el tema de Query SQLserver en el foro de SQL Server en Foros del Web. hola, estoy haciendo un procedimiento para un reporte, la idea es que tome el total del mes y sume los tickets que fueron cerrados en ...
  #1 (permalink)  
Antiguo 07/08/2015, 06:52
 
Fecha de Ingreso: agosto-2015
Mensajes: 9
Antigüedad: 4 años, 2 meses
Puntos: 0
Pregunta Query SQLserver

hola, estoy haciendo un procedimiento para un reporte, la idea es que tome el total del mes y sume los tickets que fueron cerrados en cada periodo de tiempo, 4, 8, 24,72,168 o mas de 168 horas
esta es mi query

Código SQL:
Ver original
  1. SELECT
  2.         COUNT(ti.id)AS total_id,
  3.         datepart(MONTH,ti.create_time) AS mes,
  4. SUM(CASE WHEN  DateDiff(MINUTE, ti.create_time, his.nlasttime) BETWEEN 0 AND 240 THEN 1 ELSE 0 END) AS Hasta4HH,
  5. SUM(CASE WHEN  DateDiff(MINUTE, ti.create_time, his.nlasttime) BETWEEN 241 AND 480  THEN 1 ELSE 0 END) AS Hasta8HH,
  6. SUM(CASE WHEN  DateDiff(MINUTE, ti.create_time, his.nlasttime) BETWEEN 481 AND 1440  THEN 1 ELSE 0 END) AS Hasta24HH,
  7. SUM(CASE WHEN  DateDiff(MINUTE, ti.create_time, his.nlasttime) BETWEEN 1441 AND 4320  THEN 1 ELSE 0 END) AS Hasta72HH,
  8. SUM(CASE WHEN  DateDiff(MINUTE, ti.create_time, his.nlasttime) BETWEEN 4321 AND 10080  THEN 1 ELSE 0 END) AS Hasta168HH,
  9. SUM(CASE WHEN  DateDiff(MINUTE, ti.create_time, his.nlasttime) > 10080  THEN 1 ELSE 0 END) AS Mayores168HH
  10.     FROM Otrs.dbo.ticket_history h
  11.  INNER JOIN Otrs.dbo.ticket ti ON h.ticket_id = ti.id
  12.  INNER JOIN Otrs.dbo.ticket_state s ON ti.ticket_state_id = s.id
  13.  LEFT JOIN otrs.dbo.vwTicketHistoryClose his ON ti.id = his.ticket_id    
  14.         WHERE  datepart(MONTH,ti.create_time)>= datepart(MONTH,DATEADD(MONTH,-1,getdate())) AND
  15. datepart(YEAR,ti.create_time)>= datepart(YEAR,DATEADD(MONTH,-1,getdate()))
  16.         GROUP BY datepart(MONTH,ti.create_time)

mi problema es que me muestra un mes completo ejemplo hoy estamos a 7 de agosto y retrocede hasta el 7 de julio necesito que solo me muestre lo que va de agosto, alguien me podria ayudar con eso?

de antemano gracias!!
saludos

Última edición por gnzsoloyo; 07/08/2015 a las 07:04
  #2 (permalink)  
Antiguo 07/08/2015, 07:05
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.318
Antigüedad: 11 años, 10 meses
Puntos: 2653
Respuesta: Query SQLserver

Movido a Foro de SQL Server. La sintaxis no es de MySQL.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #3 (permalink)  
Antiguo 07/08/2015, 07:15
 
Fecha de Ingreso: agosto-2015
Mensajes: 9
Antigüedad: 4 años, 2 meses
Puntos: 0
Respuesta: Query SQLserver

gracias! eso mismo estaba tratando de hacer.. me equivoque al seleccionar :)
  #4 (permalink)  
Antiguo 08/08/2015, 12:45
Avatar de Libras
Colaborador
 
Fecha de Ingreso: agosto-2006
Ubicación: En la hermosa perla de occidente
Mensajes: 7.404
Antigüedad: 13 años, 2 meses
Puntos: 774
Respuesta: Query SQLserver

Pues si tienes en tu where -1 mes pues te va a mostrar todo lo del mes de julio mas agosto, si nada mas quieres lo de este mes podrias usar:

Código SQL:
Ver original
  1. SELECT
  2.         COUNT(ti.id)AS total_id,
  3.         datepart(MONTH,ti.create_time) AS mes,
  4. SUM(CASE WHEN  DateDiff(MINUTE, ti.create_time, his.nlasttime) BETWEEN 0 AND 240 THEN 1 ELSE 0 END) AS Hasta4HH,
  5. SUM(CASE WHEN  DateDiff(MINUTE, ti.create_time, his.nlasttime) BETWEEN 241 AND 480  THEN 1 ELSE 0 END) AS Hasta8HH,
  6. SUM(CASE WHEN  DateDiff(MINUTE, ti.create_time, his.nlasttime) BETWEEN 481 AND 1440  THEN 1 ELSE 0 END) AS Hasta24HH,
  7. SUM(CASE WHEN  DateDiff(MINUTE, ti.create_time, his.nlasttime) BETWEEN 1441 AND 4320  THEN 1 ELSE 0 END) AS Hasta72HH,
  8. SUM(CASE WHEN  DateDiff(MINUTE, ti.create_time, his.nlasttime) BETWEEN 4321 AND 10080  THEN 1 ELSE 0 END) AS Hasta168HH,
  9. SUM(CASE WHEN  DateDiff(MINUTE, ti.create_time, his.nlasttime) > 10080  THEN 1 ELSE 0 END) AS Mayores168HH
  10.     FROM Otrs.dbo.ticket_history h
  11.  INNER JOIN Otrs.dbo.ticket ti ON h.ticket_id = ti.id
  12.  INNER JOIN Otrs.dbo.ticket_state s ON ti.ticket_state_id = s.id
  13.  LEFT JOIN otrs.dbo.vwTicketHistoryClose his ON ti.id = his.ticket_id    
  14.         WHERE  datepart(MONTH,ti.create_time)>= datepart(MONTH,getdate()) AND
  15. datepart(YEAR,ti.create_time)>= datepart(YEAR,DATEADD(MONTH,-1,getdate()))
  16.         GROUP BY datepart(MONTH,ti.create_time)
__________________
What does an execution plan say to t-sql query? Go f**k yourself, if you are not happy with me
  #5 (permalink)  
Antiguo 10/08/2015, 12:09
 
Fecha de Ingreso: agosto-2015
Mensajes: 9
Antigüedad: 4 años, 2 meses
Puntos: 0
Respuesta: Query SQLserver

ahora he encontrado otro problema, esta query debe darme el total de tickets cerrados segun los rangos de horas ya antes mencionados, pero pasa que cada ticket puede tener varios tipis de cierres pero el cierre numero 2 es el unico q cuenta como cerrado ya que los ejecutivos pueden abrirlo para editarlo y cerrarlo incompleto etc casos, entonces agregue en el s.name ='closed successful' suponiendo que asi filtraria por el tipo de cierre, pero no me resulto D: en que me estoy equivocando?

Libras gracias por la ayuda anterior!!!

Código SQL:
Ver original
  1. SELECT
  2.   COUNT(DISTINCT ti.id)AS total_id,
  3.   datepart(MONTH,ti.create_time) AS mes,
  4.  
  5. SUM (CASE WHEN  DateDiff(MINUTE, ti.create_time, his.nlasttime) BETWEEN 0 AND 240 THEN 1 ELSE 0 END) AS Hasta4HH,
  6. SUM(CASE WHEN  DateDiff(MINUTE, ti.create_time, his.nlasttime) BETWEEN 241 AND 480  THEN 1 ELSE 0 END) AS Hasta8HH,
  7. SUM(CASE WHEN  DateDiff(MINUTE, ti.create_time, his.nlasttime) BETWEEN 481 AND 1440  THEN 1 ELSE 0 END) AS Hasta24HH,
  8. SUM(CASE WHEN  DateDiff(MINUTE, ti.create_time, his.nlasttime) BETWEEN 1441 AND 4320  THEN 1 ELSE 0 END) AS Hasta72HH,
  9. SUM(CASE WHEN  DateDiff(MINUTE, ti.create_time, his.nlasttime) BETWEEN 4321 AND 10080  THEN 1 ELSE 0 END) AS Hasta168HH,
  10. SUM(CASE WHEN  DateDiff(MINUTE, ti.create_time, his.nlasttime) > 10080  THEN 1 ELSE 0 END) AS Mayores168HH
  11. FROM Otrs.dbo.ticket_history h
  12.   INNER JOIN Otrs.dbo.ticket ti ON h.ticket_id = ti.id
  13.   INNER JOIN Otrs.dbo.ticket_state s ON ti.ticket_state_id = s.id
  14.   LEFT JOIN otrs.dbo.vwTicketHistoryClose his ON ti.id = his.ticket_id    
  15.   WHERE  s.name ='closed successful' AND
  16.   datepart(MONTH,ti.create_time)>= datepart(MONTH,DATEADD(MONTH,-1,getdate())) AND
  17.   datepart(YEAR,ti.create_time)>= datepart(YEAR,DATEADD(MONTH,-1,getdate()))
  18.   AND (DATEPART(MONTH,ti.create_time)) >= (datepart(MONTH,getdate()))
  19.  GROUP BY datepart(MONTH,ti.create_time)

Última edición por gnzsoloyo; 10/08/2015 a las 12:18
  #6 (permalink)  
Antiguo 12/08/2015, 12:50
Avatar de Libras
Colaborador
 
Fecha de Ingreso: agosto-2006
Ubicación: En la hermosa perla de occidente
Mensajes: 7.404
Antigüedad: 13 años, 2 meses
Puntos: 774
Respuesta: Query SQLserver

un ejemplo de tus datos ayudaria mas :)
__________________
What does an execution plan say to t-sql query? Go f**k yourself, if you are not happy with me
  #7 (permalink)  
Antiguo 14/08/2015, 12:48
 
Fecha de Ingreso: agosto-2015
Mensajes: 9
Antigüedad: 4 años, 2 meses
Puntos: 0
De acuerdo Respuesta: Query SQLserver

gracias pero ya solucione todo lo que necesitaba dejo la query por si llega a servirle a alguien, me pidieron el mes en palabras, el porcentaje de cada rango, agrupar por mes y año y bueno mostrar los ultimos 3 meses.. ojala le sirva a alguien mas... saludos

nuevamente gracias libra ;)
Código SQL:
Ver original
  1. SELECT COUNT(DISTINCT ti.id)AS total_id,
  2. CASE DATEPART(MONTH,ti.create_time)
  3. WHEN 12 THEN 'diciembre'
  4. WHEN 11 THEN 'noviembre'
  5. WHEN 10 THEN 'octubre'
  6. WHEN 9 THEN 'septiembre'
  7. WHEN 8 THEN 'agosto'
  8. WHEN 7 THEN 'julio'
  9. WHEN 6 THEN 'junio'
  10. WHEN 5 THEN 'mayo'
  11. WHEN 4 THEN 'abril'
  12. WHEN 3 THEN 'marzo'
  13. WHEN 2 THEN 'febrero'
  14. WHEN 1 THEN 'enero'
  15. END AS mes,
  16. (((SUM(CASE WHEN DateDiff(MINUTE, ti.create_time, his.nlasttime) BETWEEN 0 AND 240 THEN 1 ELSE 0 END))*100)/COUNT(DISTINCT ti.id)) AS Hasta4HH,      
  17. (((SUM(CASE WHEN DateDiff(MINUTE, ti.create_time, his.nlasttime) BETWEEN 241 AND 480 THEN 1 ELSE 0 END))*100)/COUNT(DISTINCT ti.id)) AS Hasta8HH,
  18. (((SUM(CASE WHEN DateDiff(MINUTE, ti.create_time, his.nlasttime) BETWEEN 481 AND 1440 THEN 1 ELSE 0 END))*100)/COUNT(DISTINCT ti.id)) AS Hasta24HH,
  19. (((SUM(CASE WHEN DateDiff(MINUTE, ti.create_time, his.nlasttime) BETWEEN 1441 AND 4320 THEN 1 ELSE 0 END))*100)/COUNT(DISTINCT ti.id)) AS Hasta72HH,
  20. (((SUM(CASE WHEN DateDiff(MINUTE, ti.create_time, his.nlasttime) BETWEEN 4321 AND 10080 THEN 1 ELSE 0 END))*100)/COUNT(DISTINCT ti.id)) AS Hasta168HH,
  21. (((SUM(CASE WHEN DateDiff(MINUTE, ti.create_time, his.nlasttime) > 10080 THEN 1 ELSE 0 END))*100)/COUNT(DISTINCT ti.id)) AS Mayores168HH
  22.    FROM [Otrs].[dbo].[ticket] ti
  23.   INNER JOIN Otrs.dbo.ticket_state s ON ti.ticket_state_id = s.id
  24.   LEFT JOIN otrs.dbo.vwTicketHistoryClose his ON ti.id = his.ticket_id
  25.   INNER JOIN Otrs.dbo.queue q ON  ti.queue_id = q.id
  26.   WHERE datepart(MONTH,ti.create_time)>= datepart(MONTH,DATEADD(MONTH,-2,getdate())) AND
  27.   datepart(YEAR,ti.create_time)>= datepart(YEAR,DATEADD(MONTH,-2,getdate()))
  28.    AND q.name NOT LIKE '%SSGG%'
  29.    AND ti.ticket_state_id = 2
  30.    AND ti.type_id IN( 2 , 4 )
  31.   GROUP BY datepart(MONTH,ti.create_time),datepart(YEAR,ti.create_time)
  32.   ORDER BY datepart(YEAR,ti.create_time) ASC,datepart(MONTH,ti.create_time) ASC

Última edición por gnzsoloyo; 14/08/2015 a las 12:54
  #8 (permalink)  
Antiguo 14/08/2015, 14:06
Avatar de iislas
Colaborador
 
Fecha de Ingreso: julio-2007
Ubicación: Mexico, D.F.
Mensajes: 6.480
Antigüedad: 12 años, 3 meses
Puntos: 180
Respuesta: Query SQLserver

Si deseas obtener el NOMBRE DEL MES, es mucho mas simple hacerlo asi:

Código SQL:
Ver original
  1. SET LANGUAGE spanish
  2. SELECT DATEname(MONTH,GETDATE())
__________________
MCTS Isaias Islas

Etiquetas: builder, report, server, sql
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta

SíEste tema le ha gustado a 2 personas




La zona horaria es GMT -6. Ahora son las 05:45.