2009-07-08 107 views
3

我想結合查詢中的三個表 - 日期,潛在顧客和點擊。聯合計數或加入總和 - MySQL

的表是這樣的:

日期:

|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。如果我移動代碼並從主表中選擇,我會在所有的點擊中獲得引導權利。我一直無法找到從查詢中獲得兩個計數的方法。

於是,我就不是一個左聯接:

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美元,作爲牽頭佣金。

所以在UNION中,我遇到了計數問題,在左邊的連接中,它是SUM不工作。

如果可能的話,我真的想堅持UNION,但我還沒有找到一種方法從它得到兩個計數。

(這是後續的this之前的問題,但由於我沒有要求計數,因此我發佈了一個新問題。)

+0

如果有人知道了解決UNION ALL我會非常渴望知道解決方案,因爲該聯盟更多容易與LEFT JOIN合作。 – boingboing 2009-07-09 14:37:05

回答

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 
+0

只好做一些小的改動,但終於奏效了,謝謝! – boingboing 2009-07-09 14:21:48

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