2011-04-16 98 views
1

我对SQL查询感到有点沮丧,真的可以使用帮助。基本上,我有一个客户互动表(销售拜访),其中有customer_idsales_locationvisit_date。我有一个单独的表格,其中有访问产生的订单。一些访问导致零订单,而其他访问导致多个订单。订单表具有customer_idorder_date,每行代表不同的顺序。SQL按日期范围加入

我需要创建一个合并表,每个订单或访问都有一行链接到订单源自的sales_location。基本上,表格设计不佳,我们需要了解哪些销售地点每个客户访问都会产生大量订单。

我需要做的,我正在努力的一件事就是使用SQL隐式地根据order_date找出它与那个customer_id相关的交互。例如,假设我们在里诺与客户#463进行了互动,然后在达拉斯与两个日期有两次互动。由于里诺之旅以及达拉斯之旅(或没有),我们可能有3个订单。我需要使用订单的日期来确定订单来自哪个销售地点。做这个的最好方式是什么?

+0

你可以发布一些示例数据和表设计? – grantk 2011-04-16 23:20:53

+0

“visit_date”和“order_date”对于访问销售关联而言是相同的?或者是否有可能在与客户互动后的3天后完成订单? – 2011-04-16 23:23:47

+0

如果客户在同一天旅行并进行多个订单,则在订购订单的位置时会遇到一些麻烦。 – grantk 2011-04-16 23:29:27

回答

1

假设订单之前的最后一次访问与订单相关联。

并且没有客户在同一天访问两个(或更多)不同的地点(实际上这会在结果中显示两个访问都与下一次销售相关联)。

SELECT s.customer_id 
    , s.sales_location 
    , s.visit_date 
    , g.customer_id 
    , g.order_date 
FROM sales_location s 
    FULL JOIN      <--- replace with LEFT JOIN 
    (SELECT o.customer_id 
      , MAX(s.visit_date) AS last_visit_date 
      , o.order_date 
     FROM order o 
     LEFT JOIN sales_location s 
      ON s.customer_id = o.customer_id 
      AND s.visit_date <= o.order_date 
     GROUP BY o.customer_id 
      , o.order_date 
    ) AS g 
    ON g.customer_id = s.customer_id 
    AND g.last_visit_date = s.visit_date 

您可以用LEFT JOIN替换FULL JOIN。将不会显示无法通过访问分配的订单(没有客户以前访问任何sales_locations的订单)。

+0

这也会列出没有导致任何订单的访问吗? – 2011-04-17 00:01:56

+0

@Miron:是的,它会的。 – 2011-04-17 00:27:19

+0

@Miron:你正在使用哪个dbms?例如,如果它是SQL-Server,可以使用“窗口化”功能更高效地完成查询。 – 2011-04-17 08:55:16