复杂的MySQL SELECT查询

时间:2011-07-27 13:38:29

标签: mysql select

你仍然关注MySQL,所以希望有人能够对这个问题有所了解

我有一个名为 customers 的表,其中包含以下列

msisdn BIGINT 20
join_date DATETIME

msisdn是识别客户的独特价值。

有一个名为 ws_billing_all 的第二个表,它具有以下结构

id  INTEGER  11 (Primary Key)
msisdn BIGINT 20
event_time DATETIME
revenue INTEGER

因此,此表存储了由msisdn确定的customers表中每个客户的所有交易。

我需要做的是确定30天后特定日期加入的所有客户的金额。

例如,2010年12月2日,收购了1,100名客户。根据ws_billing_all中的数据,当天加入的客户从此日期开始生成30天的总收入。

我可能需要另一张表,但不确定并且真的不确定如何提取这些数据。任何帮助将不胜感激。

2 个答案:

答案 0 :(得分:1)

SELECT c.msisdn, SUM(w.revenue)
FROM customers c
INNER JOIN ws_billing_all w ON c.msisdn=w.msisdn
WHERE w.event_time BETWEEN c.join_date AND DATE_ADD(c.join_date, INTERVAL 30 DAY)
GROUP BY c.msisdn

您必须在客户ID上加入两个表。然后选择在加入日期和之后30天之间发生的所有事件。按客户ID分组并使用SUM()获取每个客户的总收入。

答案 1 :(得分:1)

@Cularis非常接近......你只关心那些在一天加入的客户,并希望在接下来的30天内获得所有他们的收入......在这种情况下,客户之前永远不会有销售他们的加入日期,所以我没有明确考虑他们的实际销售日期。

SELECT 
      date( c.Join_Date ) DateJoined, 
      count( distinct c.msisdn ) DistinctMembers,
      count(*) NumberOfOrders,
      SUM(w.revenue) AmountOfRevenue
   FROM 
      customers c
         JOIN ws_billing_all w 
            ON c.msisdn = w.msisdn
           AND date( w.event_time ) <= date_add( c.Join_Date, INTERVAL 30 DAY )
   WHERE
      c.Join_Date >= SomeDateParameterValue
   group by 
      date( c.Join_Date )
   order by
      date( C.Join_Date )

编辑 - 澄清......

如果您在12月1日有150人加入,12月2日有45人,12月3日有83人,您希望看到每组人员的总收入基于他们加入30天销售的那天。 ..所以...

Joined on     Number of People     Total Revenue after 30 days
Dec 1         150                  $21,394   (up to Dec 31)
Dec 2          45                  $ 4,182   (up to Jan 1)
Dec 3          83                  $ 6,829   (up to Jan 2)

这会更好地澄清你想要的吗?然后我们可以调整查询...

最终编辑......

我认为我有你想要的东西(也有可能有用的订单数量)。将来,提供复杂性质的样本输出会很有帮助,即使它像我在这里一样简单。

关于来自customers表的我的WHERE子句....假设您只关心在给定时间范围内加入的客户,或者仅在给定日期之后加入......这是您更新条款的地方..如果你想要基于所有人,那么就完全删除它。