Pergunta

Eu tenho uma consulta com as seguintes tabelas (reduzidos para mostrar apenas as colunas interessados).

t1
code

t2
code, period, status

t3
period, desc

Agora que tenho é,

t3 é uma tabela de "períodos" únicas.

t1 é uma tabela de códigos únicos.

t2 representa a tabela de junção que liga os dois juntos, juntamente com um estado, por causa deste exemplo status = (A, B, C).

O que estou fazendo é criar um resultado da consulta que é agrupado por "período" e tem a contagem de 'códigos' em cada estado.

Isso é fácil de resolver, mas quero Eu quero estender isso para, é ter não apenas uma contagem de 'código de em A, B e C, mas também uma contagem dos códigos que não estão associadas a um período ou em outras palavras, uma contagem dos códigos que não estão em t2 para um determinado período.

Assim, o resultado que eu estou procurando é

Period    A    B    C   (Codes from t1 not found in t2)
P1        10   5    2   3
P2        5    5    5   10
Foi útil?

Solução

Você pode usar CROSS JOIN para selecionar uma matriz de todos os códigos para todos os períodos. Isso permite que você contar as linhas que não estão 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
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top