Como encontrar a contagem de transação de type1 e type2 para cada cliente no mysql
-
13-09-2019 - |
Pergunta
Eu tenho uma tabela de clientes:
id name
1 customer1
2 customer2
3 customer3
e uma mesa de operação:
id customer amount type
1 1 10 type1
2 1 15 type1
3 1 15 type2
4 2 60 type2
5 3 23 type1
O que eu quero que a minha consulta para retorno é a seguinte tabela
name type1 type2
customer1 2 1
customer2 0 1
customer3 1 0
que mostra que cliente1 fez duas operações de type1 e 1 de transação de tipo2 e assim por diante.
Existe uma consulta que eu posso usar para obter este resultado ou eu tenho que usar o código processual.
Solução
Você poderia tentar
select c.id as customer_id
, c.name as customer_name
, sum(case when t.`type` = 'type1' then 1 else 0 end) as count_of_type1
, sum(case when t.`type` = 'type2' then 1 else 0 end) as count_of_type2
from customer c
left join `transaction` t
on c.id = t.customer
group by c.id, c.name
Esta consulta precisa iterate apenas uma vez sobre a juntar-se.
Outras dicas
Dirk chegou antes de mim;)
Semelhante mas vai trabalhar no MySQL 4.1 também.
Select c.name,
sum(if(type == 1,1,0)) as `type_1_total`,
sum(if(type == 2,1,0)) as `type_2_total`,
from
customer c
join transaction t on (c.id = t.customer)
;
SELECT name,
(
SELECT COUNT(*)
FROM transaction t
WHERE t.customer = c.id
AND t.type = 'type1'
) AS type1,
(
SELECT COUNT(*)
FROM transaction t
WHERE t.customer = c.id
AND t.type = 'type2'
) AS type2
FROM customer c
Para aplicar condições WHERE
a estas colunas usar este:
SELECT name
FROM (
SELECT name,
(
SELECT COUNT(*)
FROM transaction t
WHERE t.customer = c.id
AND t.type = 'type1'
) AS type1,
(
SELECT COUNT(*)
FROM transaction t
WHERE t.customer = c.id
AND t.type = 'type2'
) AS type2
FROM customer c
) q
WHERE type1 > 3
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow