2009-07-08 65 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