Ver Mensaje Individual
  #11 (permalink)  
Antiguo 11/09/2014, 18:54
andresalvarez
 
Fecha de Ingreso: mayo-2014
Ubicación: Medellin
Mensajes: 12
Antigüedad: 10 años, 5 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;