2013-05-18 48 views
0

我試圖完成使用下面的查詢如下:SQL服務器 - 在缺少記錄加入

  • 採取一切記錄從Dial表和組根據表中所包含
  • 加入各種標準表格上的唯一密鑰(Dial.UIDHistory.UID)的History表,從表Dial

所有正在連接的返回一些信息無法獲得ne,除了它沒有返回來自Dial表的UID爲0的行(在記錄處理完成後這兩個表中都會更新,但是如果尚未處理它,它將保持爲0)。我希望將UID爲0的所有記錄的計數添加到Total Avail中。和總數符合條件的列,基於Dial.ID

任何人都可以幫忙嗎?

問候

SELECT 
    (CASE 
     WHEN History.ID = 824 or Project.Name LIKE 'Example1%' or Project.Name LIKE 'Example2' or Project.Name like '%Example3%' 
      THEN 'Team One' 
     WHEN History.ID = 814 OR Project.Name LIKE '%Example4%' 
      THEN 'Team Two' 
     ELSE 'Other' 
    END) as [Team], 
    Project.Name as [Project], 
    COUNT(Dial.ID) as [Total Avail.], 
    COUNT (CASE 
       WHEN Dial.Flag = '1' AND Dial.Att = 0 OR Dial.Att > 0 AND Dial.Flag = 0 
       THEN 1 
       ELSE NULL 
      END) AS [Total Eligible], 
    ISNULL(SUM(History.Attempt), 0) AS [Total Attempts], 
    ROUND(COUNT(CAST(ISNULL(History.Attempt, 0) AS float))/COUNT(CASE WHEN Dial.Flag = '1' OR Dial.Attempts > 0 THEN 1 ELSE NULL END), 2)*100 AS [Penetration %], 
    COUNT(History.Attempt) as [Unique Attempts], 
    COUNT (CASE WHEN History.Code IN ('EX1','EX2','EX3','EX4','EX5') 
      THEN 1 ELSE NULL END) AS [Contacts], 
    COUNT (CASE WHEN History.Code IN ('EX6','EX6','EX7') 
      THEN 1 ELSE NULL END) AS [Success] 
FROM 
    Dial Dial 
LEFT JOIN 
    History History ON Dial.UID = History.UID 
LEFT JOIN 
    Project Project ON Dial.ID = Project.ID 
WHERE 
    Dial.Field2 NOT LIKE '' 
    AND Dial.ID NOT LIKE '-%' 
    AND History.DateTime > CONVERT(datetime, convert(char(8), getdate(), 112)) 
GROUP BY 
    Project.Name, History.ID 

回答

0

讓我們來看看fromwhere部分查詢的:

FROM Dial Dial LEFT JOIN 
    History History 
    ON Dial.UID = History.UID LEFT JOIN 
    Project Project 
    ON Dial.ID = Project.ID 
WHERE Dial.Field2 NOT LIKE '' AND 
     Dial.ID NOT LIKE '-%' AND 
     History.DateTime > CONVERT(datetime,convert(char(8),getdate(),112)) 

您使用的left join是正確的,因爲你要保持一切都在感Dial表。但是,您在History.DateTime上最後一次比較時撤銷了left join。沒有匹配的記錄時它將爲NULL。而NULL將會失敗的比較。您可以通過在where子句中添加coalesce()is null來解決此問題。

另一種解決方法是將邏輯添加到on條款:

FROM Dial Dial LEFT JOIN 
    History History 
    ON Dial.UID = History.UID and 
     History.DateTime > CONVERT(datetime,convert(char(8),getdate(),112)) LEFT JOIN 
    Project Project 
    ON Dial.ID = Project.ID 
WHERE Dial.Field2 NOT LIKE '' AND 
     Dial.ID NOT LIKE '-%' 

如果您使用的是SQL Server的一個較新的版本,可以通過轉換爲date做的日期比較:

FROM Dial Dial LEFT JOIN 
    History History 
    ON Dial.UID = History.UID and 
     History.DateTime > cast(getdate() as date) LEFT JOIN 
    Project Project 
    ON Dial.ID = Project.ID 
WHERE Dial.Field2 NOT LIKE '' AND 
     Dial.ID NOT LIKE '-%' 

它使查詢更易於閱讀。

0

History.DateTime > CONVERT(datetime,convert(char(8),getdate(),112)) Line在WHERE「變成」 LEFT JOIN History到內部連接,因此結果集不包含沒有在History表中的相應條目的記錄。移動它的加入條件:

LEFT JOIN History History ON (Dial.UID = History.UID 
AND History.DateTime > CONVERT(datetime,convert(char(8),getdate(),112))) 
+0

此答案也有效!我投了另一個,因爲它更詳細。不過,感謝您的幫助。 – user2396939