2013-05-18 74 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