União com contagem ou junte -se à SUM - MySQL
Pergunta
Quero combinar três tabelas - data, chumbo e clique - em uma consulta.
As mesas se parecem com a seguinte:
encontro:
|date|
conduzir:
id|time|commission
clique:
id|time|commission
A data da tabela está apenas armazenando datas e é usada ao obter datas sem clique ou lead.
Então, se tivermos os seguintes dados nas tabelas:
encontro:
2009-06-01
2009-06-02
2009-06-03
conduzir:
1|2009-06-01|400
2|2009-06-01|300
3|2009-06-03|350
clique:
1|2009-06-01|1
2|2009-06-03|2
3|2009-06-03|2
4|2009-06-03|0
Eu gostaria de obter data, número de cliques, comissão gerada por cliques (há cliques que não dão comissão), número de leads, comissão gerada por leads e comissão total. Então, com as mesas acima, eu gostaria de obter:
2009-06-01|1|1|2|700|701|
2009-06-02|0|0|0|0|0
2009-06-03|3|4|1|350|354|
Eu tentei com a seguinte união:
SELECT
campaign_id,
commission_date,
SUM( click_commission ) AS click_commission,
click,
SUM( lead_commission ) AS lead_commission ,
lead,
SUM( total_commission ) as total_commission
FROM(
SELECT
click.campaign_id AS campaign_id,
DATE( click.time ) AS commission_date,
click.commission AS click_commission,
(SELECT count(click.id) from click GROUP BY date(click.time)) as click,
0 as lead_commission,
0 as lead,
click.commission AS total_commission
FROM click
UNION ALL
SELECT
lead.campaign_id AS campaign_id,
DATE( lead.time ) AS commission_date,
0 as click_commission,
0 as click,
lead.commission AS lead_commission,
lead.id as lead,
lead.commission AS total_commission
FROM lead
UNION ALL
SELECT
0 AS campaign_id,
date.date AS commission_date,
0 AS click_commission,
0 as click,
0 AS lead_commission,
0 as lead,
0 AS total_commission
FROM date
) AS foo
WHERE commission_date BETWEEN '2009-06-01' AND '2009-07-25'
GROUP BY commission_date
ORDER BY commission_date LIMIT 0, 10
Mas isso não funciona para contar o número de cliques e leads, o código acima fornece a quantidade certa de bots de cliques 0 em todos os leads. Se eu mover o código e colocar a seleção da tabela de chumbo, obtenho os leads Right Bot 0 em todos os cliques. Não consegui encontrar uma maneira de obter as duas contagens da consulta.
Então eu tentei um joio de esquerda:
SELECT
date.date as date,
count( DISTINCT click.id ) AS clicks,
sum(click.commission) AS click_commission,
count( lead.id ) AS leads,
sum(lead.commission) AS lead_commission
FROM date
LEFT JOIN click ON ( date.date = date( click.time ) )
LEFT JOIN lead ON ( date.date = date( lead.time ) )
GROUP BY date.date
LIMIT 0 , 30
O problema com esta consulta é que, se houver mais de um clique ou leads em uma data, ele retornará o valor esperado * 2. Portanto, em 2009-06-01, ele retornará 1400 no 700 esperado para a Comissão de Leads.
Então, no sindicato, tenho problemas com a contagem e, à esquerda, a junta é a soma que não está funcionando.
Eu realmente gostaria de seguir o sindicato, se possível, mas não encontrei uma maneira de obter os dois contagens.
(Este é um acompanhamento para isto Pergunta anterior, mas como não pedi a contagem em que publiquei uma nova pergunta.)
Solução
SELECT date,
COALESCE(lcomm, 0), COALESCE(lcnt, 0),
COALESCE(ccomm, 0), COALESCE(ccnt, 0),
COALESCE(ccomm, 0) + COALESCE(lcomm, 0),
COALESCE(ccnt, 0) + COALESCE(lcnt, 0)
LEFT JOIN
(
SELECT date, SUM(commission) AS lcomm, COUNT(*) AS lcnt
FROM leads
GROUP BY
date
) l
ON l.date = d.date
LEFT JOIN
(
SELECT date, SUM(commission) AS ccomm, COUNT(*) AS ccnt
FROM clicks
GROUP BY
date
) с
ON c.date = d.date
FROM date d
Outras dicas
O código que eu usei, construído a partir da sugestão de Quassnoi:
SELECT date,
COALESCE(ccomm, 0) AS click_commission, COALESCE(ccnt, 0) AS click_count,
COALESCE(lcomm, 0) AS lead_commision, COALESCE(lcnt, 0) AS lead_count,
COALESCE(ccomm, 0) + COALESCE(lcomm, 0) as total_commission
FROM date d
LEFT JOIN
(
SELECT DATE(time) AS lead_date, SUM(commission) AS lcomm, COUNT(*) AS lcnt
FROM lead
GROUP BY
lead_date
) l
ON lead_date = date
LEFT JOIN
(
SELECT DATE(time) AS click_date, SUM(commission) AS ccomm, COUNT(*) AS ccnt
FROM click
GROUP BY
click_date
) с
ON click_date = date