Pregunta
Tengo una consulta con las siguientes tablas (reducida para mostrar solo las columnas interesadas).
t1
code
t2
code, period, status
t3
period, desc
Ahora lo que tengo es,
t3 es una tabla de "períodos" únicos.
t1 es una tabla de códigos únicos.
t2 es la tabla de unión que une ambos, junto con un estado, en aras de este ejemplo status = (A, B, C).
Lo que estoy haciendo es crear un resultado de consulta que se agrupa por " punto " y tiene el recuento de 'códigos' en cada estado.
Eso es fácil de resolver, pero quiero extender esto a, es tener no solo un conteo de 'códigos en A, B y C, sino también un conteo de los códigos que AREN'T asoció con un período o en otras palabras, un recuento de los códigos que no están en t2 durante un período determinado.
Entonces, el resultado que estoy buscando es
Period A B C (Codes from t1 not found in t2)
P1 10 5 2 3
P2 5 5 5 10
Solución
Puede usar la combinación cruzada para seleccionar una matriz de todos los códigos para todos los períodos. Eso le permite contar las filas que no están presentes:
select
sum(case when t2.status is 'A' then 1 else 0 end) as ACount,
sum(case when t2.status is 'B' then 1 else 0 end) as BCount,
...
sum(case when t2.code is null then 1 else 0 end) as NotPresentCount
from t1
cross join t3
left join t2
on t2.code = t1.code and t2.period = t3.period
group by t3.period