3

クエリで日付、リード、クリックの3つのテーブルを組み合わせたいと思います。

テーブルは次のようになります。

日にち:

|date|

リード:

id|time|commission

クリック:

id|time|commission

テーブルの日付は日付を保存するだけで、クリックやリードなしで日付を取得するときに使用されます。

したがって、テーブルに次のデータがある場合:

日にち:

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では、リードコミッションの期待値700ではなく1400を返します。

したがって、UNIONではカウントに問題があり、左側の結合ではSUMが機能していません。

可能であればUNIONに固執したいのですが、両方のカウントを取得する方法が見つかりませんでした。

(これは、この以前の質問のフォローアップですが、カウントを要求しなかったため、新しい質問を投稿しました。)

4

2 に答える 2

2
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
于 2009-07-08T16:16:53.840 に答える
0

私が使用したコードは、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
于 2009-07-09T14:23:21.010 に答える