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

War es hilfreich?

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
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top