Contar tipo de e-mail por ID do cliente
Pergunta
Tenho um formulário que as pessoas podem usar para enviar e-mails aos nossos clientes.O usuário tem a opção de selecionar entre duas mensagens prontas (Mensagem "1" ou Mensagem "2").Nos bastidores, toda vez que eles clicam no botão "ENVIAR", ele se conecta a uma tabela "RECORDS" (desde que passe pelos manipuladores de erros).
Vamos fingir que a tabela RECORDS possui 2 colunas:
CUST_ID EMAIL_NUM
0000 1
0000 2
0000 1
0000 1
0001 2
0002 1
0002 1
0003 2
0003 2
0003 2
Preciso de uma consulta que conte uns e dois para cada CUST_ID.Portanto, o conjunto de resultados deve ser parecido com isto:
CUST_ID EMAIL_1_COUNT EMAIL_2_COUNT
0000 3 1
0001 0 1
0002 2 0
0003 0 3
Eu usei contagem, agrupamento por, tendo, enquanto, união, seleções aninhadas, mas como eu disse, provavelmente estou complicando demais algo que é relativamente fácil.
Solução
select
CUST_ID,
sum(iif(EMAIL_NUM = 1, 1, 0)) as EMAIL_1_COUNT,
sum(iif(EMAIL_NUM = 2, 1, 0)) as EMAIL_2_COUNT
from
RECORDS
group by
CUST_ID
Outras dicas
Outra opção a considerar é usar uma consulta dinâmica com TRANSFORM
TRANSFORM NZ(Count(RECORDS.Email_NUm),0) AS CountOfEmail_NUm
SELECT RECORDS.CUST_ID
FROM RECORDS
GROUP BY RECORDS.CUST_ID
PIVOT RECORDS.Email_NUm;
No entanto, isto produziria cabeças de coluna de CUST_ID
, 1
, e 2
.No entanto, se você tivesse outra tabela com os tipos de e-mail, talvez valesse a pena (especialmente se você tivesse um número maior de tipos de e-mail do que 2)
O SQL pode ficar assim
TRANSFORM NZ(Count(r.Email_NUm),0) AS CountOfEmail_NUm
SELECT r.CUST_ID
FROM RECORDS r
INNER JOIN EMAIL_TYPES et
ON r.Email_NUm = et.Email_NUm
GROUP BY r.CUST_ID
PIVOT et.TYPE_NAME;
Produzindo esta saída
CUST_ID | Work | Home
------- ---- ----
0000 | 3 | 1
0001 | 0 | 1
0002 | 2 | 0
0003 | 0 | 3