Gewerkschaft mit Count oder schließen
Frage
Ich möchte in einer Abfrage drei Tabellen - Datum, Lead und Klicken - kombinieren.
Die Tische sehen so aus:
Datum:
|date|
führen:
id|time|commission
klicken:
id|time|commission
Das Tabellendatum speichert nur Daten und wird verwendet, wenn Daten ohne Klick oder Lead erhalten werden.
Wenn wir also die folgenden Daten in den Tabellen haben:
Datum:
2009-06-01
2009-06-02
2009-06-03
führen:
1|2009-06-01|400
2|2009-06-01|300
3|2009-06-03|350
klicken:
1|2009-06-01|1
2|2009-06-03|2
3|2009-06-03|2
4|2009-06-03|0
Ich möchte Datum, Anzahl der Klicks, von Klicks generierte Provisionen (Klicks, die keine Provision angeben), Anzahl der Leads, Provisionen, die von Leads und Gesamtprovision generiert werden, erhalten. Mit den oben genannten Tischen möchte ich:
2009-06-01|1|1|2|700|701|
2009-06-02|0|0|0|0|0
2009-06-03|3|4|1|350|354|
Ich habe es mit der folgenden Gewerkschaft versucht:
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
Dies zählt jedoch nicht sowohl die Anzahl der Klicks als auch die Leads, der obige Code enthält die richtige Menge an Klicks Bot 0 für alle Leads. Wenn ich den Code bewegen und den Auswählen aus der Lead -Tabelle setze, erhalte ich die Leads Right Bot 0 auf allen Klicks. Ich konnte keinen Weg finden, um beide Zählungen aus der Abfrage zu bekommen.
Also habe ich stattdessen einen linken Join ausprobiert:
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
Das Problem bei dieser Abfrage ist, ob es mehr als ein Klick oder Leads an einem Datum gibt, das den erwarteten Wert * 2. Auf 2009-06-01 zurückgibt, gibt es stattdessen 1400 für die erwartete 700 für die Lead-Provision zurück.
In der Gewerkschaft habe ich also Probleme mit der Graf und in der linken Seite ist die Summe, die nicht funktioniert.
Ich würde es wirklich gerne bei möglich an der Gewerkschaft halten, aber ich habe keinen Weg gefunden, beide Zählungen davon zu bekommen.
(Dies ist eine Follow -up zu Dies Frühere Frage, aber da ich nicht nach der Zählung gefragt habe, dass ich eine neue Frage veröffentlicht habe.)
Lösung
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
Andere Tipps
Der Code, den ich verwendet habe, erstellt aus dem Vorschlag von 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