Вопрос

Я хочу объединить три таблицы - date, lead и click - в запросе.

Таблицы выглядят примерно так:

Дата:

|date|

ведущий:

id|time|commission

щелчок:

id|time|commission

Таблица date - это просто хранилище дат, и она используется при получении дат без кликов или лидов.

Итак, если у нас есть следующие данные в таблицах:

Дата:

2009-06-01
2009-06-02
2009-06-03

ведущий:

1|2009-06-01|400
2|2009-06-01|300
3|2009-06-03|350

щелчок:

1|2009-06-01|1
2|2009-06-03|2
3|2009-06-03|2
4|2009-06-03|0

Я хотел бы получить дату, количество кликов, комиссию, полученную за клики (есть клики, которые не дают комиссии), количество потенциальных клиентов, комиссию, полученную за лиды, и общую комиссию.Итак, с помощью приведенных выше таблиц я хотел бы получить:

2009-06-01|1|1|2|700|701|
2009-06-02|0|0|0|0|0
2009-06-03|3|4|1|350|354|

Я пробовал использовать следующий союз:

 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

Но это не работает для подсчета как количества кликов, так и лидов, приведенный выше код выдает нужное количество кликов бота 0 по всем лидам.Если я перемещу код и добавлю пункт выбрать из таблицы потенциальных клиентов, я получу количество потенциальных клиентов сразу после 0 при всех кликах.Мне не удалось найти способ получить оба значения из запроса.

Поэтому вместо этого я попробовал левое соединение:

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 

Проблема с этим запросом заключается в том, что при наличии более одного клика или интереса на дату он вернет ожидаемое значение * 2.Таким образом, в 2009-06-01 он вернет 1400 вместо ожидаемых 700 за комиссию за лидерство.

Итак, в ОБЪЕДИНЕНИИ у меня проблемы со счетом, а в левом соединении это СУММА, которая не работает.

Я бы действительно хотел придерживаться ОБЪЕДИНЕНИЯ, если это возможно, но я не нашел способа извлечь из него оба показателя.

(Это продолжение это предыдущий вопрос, но поскольку я не просил подсчета в нем, я опубликовал новый вопрос.)

Это было полезно?

Решение

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

Другие советы

Код, который я использовал, построен по предложению 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
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top