Hola GeriReshef,
En el momento de ejecutarlo encontraba algunas diferencias, solamente realice un cambio
Código SQL:
Ver originalLEFT JOIN Ta T2
ON T1.Comprador=T2.Comprador
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 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 originalWITH Ta AS
(SELECT ROW_NUMBER() OVER(Partition BY Comprador ORDER BY Fecha) N,
*
FROM #T)
SELECT *
FROM Ta T1
LEFT JOIN Ta T2
ON T1.Comprador=T2.Comprador
AND T1.N=T2.N-1;
Para obtener las calificaciones de "buena" y "mala"-
Código SQL:
Ver originalWITH Ta AS
(SELECT ROW_NUMBER() OVER(Partition BY Comprador ORDER BY Fecha) N,
*
FROM #T)
SELECT T1.Consultor,
T1.Comprador,
T1.Fecha Fecha1,
T2.Fecha Fecha2,
CASE WHEN T2.Fecha IS NULL THEN 'Buena'
WHEN DateDiff(DAY,T1.Fecha,T2.Fecha)>=31 THEN 'Buena'
ELSE 'Mala'
END Calificacion
FROM Ta T1
LEFT JOIN Ta T2
ON T1.Comprador=T2.Comprador
AND T1.N=T2.N-1;
Para contar cuantas "buenas" y "malas" tiene cada consultor:
Código SQL:
Ver originalWITH Ta AS
(SELECT ROW_NUMBER() OVER(Partition BY Comprador ORDER BY Fecha) N,
*
FROM #T),
Tb AS
(SELECT T1.Consultor,
T1.Comprador,
T1.Fecha Fecha1,
T2.Fecha Fecha2,
CASE WHEN T2.Fecha IS NULL THEN 'Buena'
WHEN DateDiff(DAY,T1.Fecha,T2.Fecha)>=31 THEN 'Buena'
ELSE 'Mala'
END Calificacion
FROM Ta T1
LEFT JOIN Ta T2
ON T1.Comprador=T2.Comprador
AND T1.N=T2.N-1)
SELECT Consultor,
SUM(CASE WHEN Calificacion='Buena' THEN 1 ELSE 0 END) Buenas,
SUM(CASE WHEN Calificacion='Mala' THEN 1 ELSE 0 END) Malas,
COUNT(*) Total
FROM Tb
GROUP BY Consultor;