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.)

Foi útil?

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
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top