Pregunta

En resumen tengo 2 tablas:

USUARIOS:

------------------------
UserID   |   Name
------------------------
0     a
1     b
2     c

CALLS:
------------------------
ToUser   |   Result
------------------------
0     ANSWERED
1     ENGAGED
1     ANSWERED
0     ANSWERED

Etc, etc. (uso una referencia numérica para el resultado en realidad)

Tengo más de 2 millones de registros que detallan una llamada a un cliente específico. Actualmente estoy usando declaraciones de casos para contar cada recuperación de un resultado en particular DESPUÉS de que ya haya hecho el recuento total rápido:

COUNT(DISTINCT l_call_log.line_id),
COALESCE (SUM(CASE WHEN l_call_log.line_result = 1 THEN 1 ELSE NULL END), 0) AS [Answered],
COALESCE (SUM(CASE WHEN l_call_log.line_result = 2 THEN 1 ELSE NULL END), 0) AS [Engaged], 
COALESCE (SUM(CASE WHEN l_call_log.line_result = 4 THEN 1 ELSE NULL END), 0) AS [Unanswered]

¿Estoy haciendo 3 exploraciones de los datos después de mi recuento total inicial? si es así, ¿hay alguna manera de hacer un barrido y contar las llamadas como resultado de una sola vez?

Gracias.

¿Fue útil?

Solución

Esto tomaría un análisis completo de la tabla.

EDIT : no hay suficiente información para responder; Debido a la eliminación de duplicados (DISTINCT) que falté anteriormente, no podemos decir qué estrategia se usaría ... especialmente sin conocer el motor de la base de datos.

En casi todos los motores de consulta principales, cada función agregada se ejecuta por cada columna por cada fila, y puede usar un resultado en caché (como COUNT (*) por ejemplo).

¿Está indexado line_result? Si es así, podría aprovechar una consulta mejor (GROUP BY + COUNT (*) para aprovechar las estadísticas del índice, aunque no estoy seguro de que valga la pena, dependiendo de sus otras tablas en la consulta.

Otros consejos

Existe la construcción GROUP BY en SQL. Prueba:

SELECT COUNT(DISTINCT l_call_log.line_id)
  GROUP BY l_call_log.line_result

Supongo que es un escaneo de tablas, ya que no tiene subconsultas dependientes. Ejecutar explicar en la consulta para estar seguro.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top