0

我有一个客户表和另一个用于与他们相关的销售活动(电话、电子邮件 ecc)。我需要知道的是,例如,在过去 30 天内,哪些客户没有被联系(没有活动)。

这是我正在尝试做的事情:

SELECT crm_customers.id, crm_ customers.companyname
FROM crm_ customers 
LEFT JOIN crm_activities on crm_customers.id = crm_ activities. Customerid
WHERE crm_ activities.createddate < (getDate() – 30)

问题是它会返回活动超过 30 天的客户,即使他们有最近的活动。我只需要获取过去 30 天内没有任何销售活动的客户 感谢您的帮助

4

2 回答 2

0

这可能会对您有所帮助:使用子查询:

select 
    cust.id, cust.compayname
from
    crm_customers as cust
    left join (
        select 
            * 
        from 
            crm_activities 
        where 
            createddate >= (getDate() - 30)
    ) as act on cust.id = act.customerId
where
    act.customerId is null

这样您就可以排除在过去 30 天内有活动的所有客户。


您可能希望通过执行以下操作来进一步清理它:

select 
    cust.id, cust.compayname
from
    crm_customers as cust
    left join (
        select distinct 
            customerId 
        from 
            crm_activities where createddate >= (getDate() - 30)
    ) as act on cust.id = act.customerId
where
    act.customerId is null

这是相同的基本思想......唯一的事情是第二个选项只返回带有活动的客户的 ID。我认为这可能会优化外部where子句,但它可能会对子查询产生性能影响(没有免费的午餐)

于 2012-10-09T17:38:45.593 回答
0
SELECT crm_customers.id, crm_customers.companyname
FROM crm_customers 
LEFT JOIN crm_activities 
  on crm_customers.id = crm_activities.Customerid
 and DATEDIFF(DD, crm_activities.createddate, getdate()) < 30
where crm_activities.Customerid is null

这是连接中的条件与 where 中的条件不同的情况

为了速度,我会怀疑子查询的连接。它为查询优化器提供了更多优化选项。不需要一个独特的。假设 crm_activities.Customerid 已编入索引,这将加入索引。对于子查询,它将使用索引来创建列表,但子查询的输出没有被索引。

将取决于你的数据。我有一张大桌子要测试。

查询计划不同。

在循环连接上它是死热在哈希连接上快两倍在合并连接上快十倍

如果没有一个被排除在外,那将是一场死胡同。
如果许多人被排除在外(在过去 30 年中已联系过),它将出现在哪里。

于 2012-10-09T18:05:48.480 回答