2011-04-16 96 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