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

[SOLUCIONADO] Problemas consultas, conteos, porcentajes

Estas en el tema de Problemas consultas, conteos, porcentajes en el foro de SQL Server en Foros del Web. Hola Comunidad, gracias de antemano por su interés en la pregunta. Tengo que realizar un proceso y no tengo idea de como hacerlo. Tengo una ...
  #1 (permalink)  
Antiguo 08/09/2014, 19:04
 
Fecha de Ingreso: mayo-2014
Ubicación: Medellin
Mensajes: 12
Antigüedad: 9 años, 10 meses
Puntos: 0
Información Problemas consultas, conteos, porcentajes

Hola Comunidad, gracias de antemano por su interés en la pregunta.

Tengo que realizar un proceso y no tengo idea de como hacerlo. Tengo una base de datos que tiene la identificación del consultor, la identificación del comprador, radicado de consulta y fecha de la consulta

La idea de la empresa es dar solución a preguntas de los compradores de seguros.

Si el comprador llama su primer vez, el consultor A, le brinda una solución, hasta ahí bien, luego el mismo comprador llama por segunda vez en menos de 1 mes, ya el Consultor A tiene esa consulta mala (Debió solucionar las inquietudes en la primera consultoria). entonces suponiendo que el consultor A realiza 100 Consultorias en un mes, y de esas 100, 30 vuelven a consultar, tengo una efectividad para el consultor del 70%. La empresa tiene 600 Consultores como genero estos dos reportes.

1- El listado de efectividad de todos los consultores.
2- El listado de cada consultoria que se repitió en la identificación del comprador.

De antemano mil gracias.
  #2 (permalink)  
Antiguo 09/09/2014, 03:28
 
Fecha de Ingreso: julio-2012
Ubicación: Israel
Mensajes: 360
Antigüedad: 11 años, 9 meses
Puntos: 40
Respuesta: Problemas consultas, conteos, porcentajes

Suponemos que estos son los datos:
Código SQL:
Ver original
  1. CREATE TABLE #T(Consultor CHAR(1),
  2.                 Comprador CHAR(3),
  3.                 Fecha DateTime);
  4. CREATE Clustered INDEX Idx_#T ON #T(Consultor,Comprador,Fecha);
  5. GO
  6.  
  7. INSERT
  8. INTO    #T
  9. VALUES  ('A','A1','20140101'), --buena
  10.         ('A','A1','20140215'),
  11.         ('A','A2','20140101'), --mala
  12.         ('A','A2','20140115'),
  13.         ('A','A3','20140101'), --buena
  14.         ('B','B1','20140101'), --mala
  15.         ('B','B1','20140110'),
  16.         ('B','B2','20140101'), --mala
  17.         ('B','B2','20140101'),
  18.         ('C','C1','20140101'), --buena
  19.         ('C','C1','20140215'),
  20.         ('C','C1','20140401');

El resumen e este caso:
Código SQL:
Ver original
  1. WITH T1 AS
  2. (SELECT ROW_NUMBER() OVER (Partition BY Consultor,Comprador ORDER BY Fecha) N,
  3.         *
  4. FROM    #T),
  5. T2 AS
  6. (SELECT Consultor,
  7.         Comprador,
  8.         CASE WHEN COUNT(*)= 2 THEN DateDiff(DAY,MIN(Fecha),MAX(Fecha)) ELSE NULL END Plazo
  9. FROM    T1
  10. WHERE   N IN (1,2)
  11. GROUP BY Consultor,
  12.         Comprador)
  13. SELECT  Consultor,
  14.         COUNT(*) Total,
  15.         SUM(CASE WHEN Plazo<31 THEN 0 ELSE 1 END) Buenas,
  16.         SUM(CASE WHEN Plazo<31 THEN 1 ELSE 0 END) Malas
  17. FROM    T2
  18. GROUP BY Consultor;
__________________
El Castellano no es mi lengua materna: discúlpenme por los errores gramaticales.
Mi blog
  #3 (permalink)  
Antiguo 09/09/2014, 07:34
Avatar de Libras
Colaborador
 
Fecha de Ingreso: agosto-2006
Ubicación: En la hermosa perla de occidente
Mensajes: 7.412
Antigüedad: 17 años, 8 meses
Puntos: 774
Respuesta: Problemas consultas, conteos, porcentajes

Wow, sin mas datos respondes eso :O todo un crack Mr GeriReshef
__________________
What does an execution plan say to t-sql query? Go f**k yourself, if you are not happy with me
  #4 (permalink)  
Antiguo 09/09/2014, 08:01
 
Fecha de Ingreso: mayo-2014
Ubicación: Medellin
Mensajes: 12
Antigüedad: 9 años, 10 meses
Puntos: 0
Respuesta: Problemas consultas, conteos, porcentajes

Lo voy a probar y te cuento como va. De antemano muchas gracias por tu atención
  #5 (permalink)  
Antiguo 09/09/2014, 08:05
 
Fecha de Ingreso: julio-2012
Ubicación: Israel
Mensajes: 360
Antigüedad: 11 años, 9 meses
Puntos: 40
Respuesta: Problemas consultas, conteos, porcentajes

Cita:
Iniciado por Libras Ver Mensaje
Wow, sin mas datos respondes eso :O todo un crack Mr GeriReshef
Ya que tenemos "No SQL",
es muy recomendable el "No datos"..
__________________
El Castellano no es mi lengua materna: discúlpenme por los errores gramaticales.
Mi blog
  #6 (permalink)  
Antiguo 09/09/2014, 13:23
 
Fecha de Ingreso: mayo-2014
Ubicación: Medellin
Mensajes: 12
Antigüedad: 9 años, 10 meses
Puntos: 0
Respuesta: Problemas consultas, conteos, porcentajes

Hola GeriReshef, gracias por tu respuesta.

Lo he ensayado y no funciona pero se que la respuesta está cerca te explico:


la tabla puede contener los siguientes datos de ejemplo:

Código SQL:
Ver original
  1. CREATE TABLE #T(Consultor CHAR(1),
  2.                 Comprador CHAR(3),
  3.                 Fecha DateTime);
  4. CREATE Clustered INDEX Idx_#T ON #T(Consultor,Comprador,Fecha);
  5. GO
  6.  
  7. INSERT
  8. INTO    #T
  9. VALUES  ('A','A1','20140101'), --buena
  10.         ('A','A1','20140215'),
  11.         ('A','A2','20140101'), --mala
  12.         ('A','A2','20140115'),
  13.         ('A','A3','20140101'), --buena
  14.         ('B','B1','20140101'), --mala
  15.         ('B','B1','20140110'),
  16.         ('B','B2','20140101'), --mala
  17.         ('B','A2','20140103'), -- Este muestra que el usuario A2 preguntó a un asesor distinto antes le habia consultado a A y esta vez le consulta a B, por ende está mala
  18.         ('C','C1','20140101'), --buena
  19.         ('C','A2','20140125'), --Este muestra nuevamente al usuario consultando por Tercera Vez a un consultor distinto. Es buena para el ultimo consultor, pero es mala para los otros dos consultores dentro del mes (30 días) ya que el cliente vuelve a llamar
  20.         ('C','C1','20140401');

Un ejemplo claro como se realiza al dia de hoy en excel es:

Se ordena la BD por Cliente luego por Fecha. Se valida si el cliente es igual al del registro superior, si es correcto, se valida la fecha del registro actual con el registro anterior y si el resultado es menor a 30 dias, entonces es mala de lo contrario es buena. En excel se hace esta validación en una columna nueva. luego en una tabla dinamica se muestra el resultado del consultor, cuantas buenas y cuantas malas tiene. No se si me hago entender, de todos modos agradezco su ayuda.

Última edición por andresalvarez; 09/09/2014 a las 13:35 Razón: Agregar Nuevo ejemplo
  #7 (permalink)  
Antiguo 10/09/2014, 08:28
 
Fecha de Ingreso: julio-2012
Ubicación: Israel
Mensajes: 360
Antigüedad: 11 años, 9 meses
Puntos: 40
Respuesta: Problemas consultas, conteos, porcentajes

Andrés- no estoy seguro que entiendo tu ejemplo:
A1- buena (volvió después de más de un mes)
A2- mala (volvió después de menos de un mes)
A3- buena (no volvió)
B1- mala (volvió después de menos de un mes)
B2- buena (no volvió)
C1- buena (volvió después de más de un mes)

¿Que pasa si vuelve en la segunda vez a otro consultor?
¿Que pasa si vuelve en la tercera/cuarta/.. vez a otro consultor (a pesar que en la segunda vilvió al original después de más de un mes)?
__________________
El Castellano no es mi lengua materna: discúlpenme por los errores gramaticales.
Mi blog

Última edición por GeriReshef; 10/09/2014 a las 08:34
  #8 (permalink)  
Antiguo 10/09/2014, 09:18
 
Fecha de Ingreso: mayo-2014
Ubicación: Medellin
Mensajes: 12
Antigüedad: 9 años, 10 meses
Puntos: 0
Respuesta: Problemas consultas, conteos, porcentajes

Hola GeriReshef, Gracias por tu interés.

La empresa es de soluciones integrales, la idea es dejar al cliente satisfecho y que el NO vuelva a consultar, la idea es que en la primer consultaría salga totalmente satisfecho.

Entonces la primer consulta sin importar el Empleado (Consultor) esta bien. Pero si vuelve a consultar, sin importar el empleado en menos de 30 días, es penalizable el primer consultor, porque no brindo una buena consultoría.

Entonces si consulta por tercera vez en menos de un mes, se deben penalizar 2 Consultores. El primer por la segunda consulta y el segundo por la tercer consulta.

La idea es garantizar que el usuario no consulte en el próximo mes, así se mejora el tiempo de labor. Entonces se debe brindar respuestas concretas, claras y asertivas de los seguros.

Luego en cualquier momento yo realizo la consulta y me aparecerá lo siguiente:

Consultor1 Atiende 100 Consultas de las cuales 30 usuarios vuelven a consultar en menos de un mes.

Titulos: ('Consultor','Consultas','Malas','Buenas')
Registros: ('Consultor1',100,30,70)

Creo que está mejor explicado esta vez. Si tienes cualquier otra duda, te agradecería infinitamente.
  #9 (permalink)  
Antiguo 10/09/2014, 09:19
 
Fecha de Ingreso: mayo-2014
Ubicación: Medellin
Mensajes: 12
Antigüedad: 9 años, 10 meses
Puntos: 0
Respuesta: Problemas consultas, conteos, porcentajes

Si tienes conocimiento de excel, me indicas te indico las formulas que se realizan al día de hoy.

Gracias.

Última edición por andresalvarez; 10/09/2014 a las 09:20 Razón: .
  #10 (permalink)  
Antiguo 11/09/2014, 04:31
 
Fecha de Ingreso: julio-2012
Ubicación: Israel
Mensajes: 360
Antigüedad: 11 años, 9 meses
Puntos: 40
Respuesta: Problemas consultas, conteos, porcentajes

Espero que te entendí: tenemos que coincidir cada consulta de un comprador con la siguiente:
si no existe la siguiente- es "buena"
si existe una pero paso más de un mes- es "buena"
si existe una pero paso menos de un mes- es "mala".

Para coincidir cada consulta con la siguiente- utilizo este código:
Código SQL:
Ver original
  1. WITH Ta AS
  2. (SELECT ROW_NUMBER() OVER(Partition BY Comprador ORDER BY Fecha) N,
  3.         *
  4. FROM    #T)
  5. SELECT  *
  6. FROM    Ta T1
  7. LEFT JOIN Ta T2
  8.         ON T1.Comprador=T2.Comprador
  9.         AND T1.N=T2.N-1;

Para obtener las calificaciones de "buena" y "mala"-
Código SQL:
Ver original
  1. WITH Ta AS
  2. (SELECT ROW_NUMBER() OVER(Partition BY Comprador ORDER BY Fecha) N,
  3.         *
  4. FROM    #T)
  5. SELECT  T1.Consultor,
  6.         T1.Comprador,
  7.         T1.Fecha Fecha1,
  8.         T2.Fecha Fecha2,
  9.         CASE WHEN T2.Fecha IS NULL THEN 'Buena'
  10.             WHEN DateDiff(DAY,T1.Fecha,T2.Fecha)>=31 THEN 'Buena'
  11.             ELSE 'Mala'
  12.             END Calificacion
  13. FROM    Ta T1
  14. LEFT JOIN Ta T2
  15.         ON T1.Comprador=T2.Comprador
  16.         AND T1.N=T2.N-1;

Para contar cuantas "buenas" y "malas" tiene cada consultor:
Código SQL:
Ver original
  1. WITH Ta AS
  2. (SELECT ROW_NUMBER() OVER(Partition BY Comprador ORDER BY Fecha) N,
  3.         *
  4. FROM    #T),
  5. Tb AS
  6. (SELECT T1.Consultor,
  7.         T1.Comprador,
  8.         T1.Fecha Fecha1,
  9.         T2.Fecha Fecha2,
  10.         CASE WHEN T2.Fecha IS NULL THEN 'Buena'
  11.             WHEN DateDiff(DAY,T1.Fecha,T2.Fecha)>=31 THEN 'Buena'
  12.             ELSE 'Mala'
  13.             END Calificacion
  14. FROM    Ta T1
  15. LEFT JOIN Ta T2
  16.         ON T1.Comprador=T2.Comprador
  17.         AND T1.N=T2.N-1)
  18. SELECT  Consultor,
  19.         SUM(CASE WHEN Calificacion='Buena' THEN 1 ELSE 0 END) Buenas,
  20.         SUM(CASE WHEN Calificacion='Mala' THEN 1 ELSE 0 END) Malas,
  21.         COUNT(*) Total
  22. FROM    Tb
  23. GROUP BY Consultor;
__________________
El Castellano no es mi lengua materna: discúlpenme por los errores gramaticales.
Mi blog
  #11 (permalink)  
Antiguo 11/09/2014, 18:54
 
Fecha de Ingreso: mayo-2014
Ubicación: Medellin
Mensajes: 12
Antigüedad: 9 años, 10 meses
Puntos: 0
Respuesta: Problemas consultas, conteos, porcentajes

Hola GeriReshef,

En el momento de ejecutarlo encontraba algunas diferencias, solamente realice un cambio

Código SQL:
Ver original
  1. LEFT JOIN Ta T2
  2.         ON T1.Comprador=T2.Comprador
  3.         AND T1.N=T2.N-1; --Se cambia por T2.N=T1.N-1 y funciona perfectamente

Te agradezco infinitamente, me gustaría que me explicaras con tus palabras como usar el LEFT JOIN, de resto el código se entiende perfectamente.

Nuevamente infinitas gracias, se marca el post como SOLUCIONADO.

Cita:
Iniciado por GeriReshef Ver Mensaje
Espero que te entendí: tenemos que coincidir cada consulta de un comprador con la siguiente:
si no existe la siguiente- es "buena"
si existe una pero paso más de un mes- es "buena"
si existe una pero paso menos de un mes- es "mala".

Para coincidir cada consulta con la siguiente- utilizo este código:
Código SQL:
Ver original
  1. WITH Ta AS
  2. (SELECT ROW_NUMBER() OVER(Partition BY Comprador ORDER BY Fecha) N,
  3.         *
  4. FROM    #T)
  5. SELECT  *
  6. FROM    Ta T1
  7. LEFT JOIN Ta T2
  8.         ON T1.Comprador=T2.Comprador
  9.         AND T1.N=T2.N-1;

Para obtener las calificaciones de "buena" y "mala"-
Código SQL:
Ver original
  1. WITH Ta AS
  2. (SELECT ROW_NUMBER() OVER(Partition BY Comprador ORDER BY Fecha) N,
  3.         *
  4. FROM    #T)
  5. SELECT  T1.Consultor,
  6.         T1.Comprador,
  7.         T1.Fecha Fecha1,
  8.         T2.Fecha Fecha2,
  9.         CASE WHEN T2.Fecha IS NULL THEN 'Buena'
  10.             WHEN DateDiff(DAY,T1.Fecha,T2.Fecha)>=31 THEN 'Buena'
  11.             ELSE 'Mala'
  12.             END Calificacion
  13. FROM    Ta T1
  14. LEFT JOIN Ta T2
  15.         ON T1.Comprador=T2.Comprador
  16.         AND T1.N=T2.N-1;

Para contar cuantas "buenas" y "malas" tiene cada consultor:
Código SQL:
Ver original
  1. WITH Ta AS
  2. (SELECT ROW_NUMBER() OVER(Partition BY Comprador ORDER BY Fecha) N,
  3.         *
  4. FROM    #T),
  5. Tb AS
  6. (SELECT T1.Consultor,
  7.         T1.Comprador,
  8.         T1.Fecha Fecha1,
  9.         T2.Fecha Fecha2,
  10.         CASE WHEN T2.Fecha IS NULL THEN 'Buena'
  11.             WHEN DateDiff(DAY,T1.Fecha,T2.Fecha)>=31 THEN 'Buena'
  12.             ELSE 'Mala'
  13.             END Calificacion
  14. FROM    Ta T1
  15. LEFT JOIN Ta T2
  16.         ON T1.Comprador=T2.Comprador
  17.         AND T1.N=T2.N-1)
  18. SELECT  Consultor,
  19.         SUM(CASE WHEN Calificacion='Buena' THEN 1 ELSE 0 END) Buenas,
  20.         SUM(CASE WHEN Calificacion='Mala' THEN 1 ELSE 0 END) Malas,
  21.         COUNT(*) Total
  22. FROM    Tb
  23. GROUP BY Consultor;
  #12 (permalink)  
Antiguo 12/09/2014, 08:34
 
Fecha de Ingreso: julio-2012
Ubicación: Israel
Mensajes: 360
Antigüedad: 11 años, 9 meses
Puntos: 40
Respuesta: Problemas consultas, conteos, porcentajes

Me parece que tu solución no tiene mucho sentido, sin embargo- te explicaré la mia:



(lamentablemente el sistema no muestra esta foto:
https://drive.google.com/file/d/0B3o...it?usp=sharing)

De las 12 líneas de la table
6 no tienen coincidencia (buenas)
2 tienen coincidecia de más de un mes (buenas)
4 tienen coincidencia de menos de un mes (malas)

El Left Join nos posibilita mostrar también las 6 filas de la izquierda que no tienen coincidencia en la derecha.
__________________
El Castellano no es mi lengua materna: discúlpenme por los errores gramaticales.
Mi blog

Última edición por GeriReshef; 12/09/2014 a las 08:41

Etiquetas: conteo, porcentajes, query, reportes
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




La zona horaria es GMT -6. Ahora son las 09:17.