2014-03-27 80 views
-1

我是新來的SQL ...SQL Server;試圖加入三個表,彙總和分組結果

我有以下三個表工作:

表:廣告系列

Campaign SourcePhone StartDate EndDate 
A   1112223333 20140303 20140309 
B   2223334444 20140303 20140309 
C   1112223333 20140310 20140316 
D   3334445555 20140217 20150217 

表:PhoneMapping(將來自Campaigns的SourcePhone映射到訂單表)

SourcePhone TransferToPhone 
1112223333 9998887777 
1112223333 8887776666 
2223334444 7776665555 
3334445555 6665554444 
3334445555 5554443333 

表:訂單

Date  TransferToPhone Orders 
20140304 9998887777  3 
20140304 8887776666  4 
20140304 6665554444  34 
20140305 7776665555  7 
20140305 9998887777  5 
20140306 9998887777  10 
20140306 8887776666  13 
20140307 8887776666  7 
20140309 7776665555  1 
20140311 9998887777  35 
20140313 8887776666  8 
20140315 9998887777  22 
20140305 6665554444  11 

我一直在試圖想出一個查詢,將加入這三個表,並提供以下結果。基本上,我需要爲每個廣告系列,SourcePhone#,轉移到電話號碼和日期範圍(每個廣告系列的StartDate和EndDate之間)提供TotalOrders的總和。以下是我期待查詢提供的結果(我認爲我的數學是正確的)。任何幫助是極大的讚賞!

預期結果:

Campaign SourcePhone TransferToPhone StartDate EndDate  TotalOrders 
A   1112223333 9998887777  20140303 20140309 18 
A   1112223333 8887776666  20140303 20140309 24 
B   2223334444 7776665555  20140303 20140309 8 
C   1112223333 9998887777  20140310 20140316 57 
C   1112223333 8887776666  20140310 20140316 8 
D   3334445555 6665554444  20140217 20150217 45 

這裏是我試過了,但它並不羣基礎上的日期範圍內的數據:

SELECT C.Campaign, C.SourcePhone, PM.TransferToPhone, C.StartDate , C.EndDate, O.TotalOrders 
FROM Campaigns AS C 
    INNER JOIN 
     (SELECT SourcePhone, TransferToPhone 
      FROM   PhoneMapping 
      WHERE  (TransferToPhone IS NOT NULL)) AS PM ON C.SourcePhone = PM.SourcePhone 
      INNER JOIN 
      (SELECT  TransferToPhone, SUM(Orders) AS TotalOrders 
       FROM   Orders 
       WHERE  (Orders IS NOT NULL) 
       Group by TransferToPhone) AS O ON PM.TransferToPhone = O.TransferToPhone 

GROUP BY C.Campaign, C.SourcePhone, PM.TransferToPhone, C.StartDate , C.EndDate 
+1

MySQL還是Microsoft?請修復您的標籤。另請查閱JOIN標籤。 –

+1

哪個RDBMS,並且提供適當的DDL(和/或sqlfiddle)與期望的結果集合在一起。另外,告訴我們你已經嘗試了一些東西。 – Strawberry

+0

感謝您的意見。這些標籤已經更新,並且我嘗試使用的查詢已發佈。 – user3469435

回答

1

這是否讓你你需要什麼?

SELECT C.Campaign, 
     C.SourcePhone, 
     P.TransferToPhone, 
     C.StartDate, 
     C.EndDate, 
     SUM(O.TotalOrders) 
FROM Campaigns C 
    JOIN PhoneMapping P 
    ON C.SourcePhone = P.SourcePhone 
    JOIN Orders O 
    ON O.TransferToPhone = P.TransferToPhone 
GROUP BY C.Campaign, C.StartDate, C.EndDate, P.SourcePhone, P.TransferToPhone 
+3

應該提到的是,通常所有的表都應該有一個唯一的ID。其他表應該鏈接在這些鍵上。因此,您不應該在此處使用SourcePhone和TransferPhone上的映射,而應該使用類似CampaignID,PhoneMappingID和OrderID的內容。 –

+0

同意,這將有助於準確地識別獨特的記錄並提高標準化,因爲不再需要複製SourcePhone和TransferToPhone。 –

+0

更不用說數據庫索引變得容易得多,因此隨着數據庫記錄的增長,應用程序的性能隨着時間的推移而增加。 –