Объединение с Count Или Объединение с Sum - MySQL
Вопрос
Я хочу объединить три таблицы - 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