0

我正在尝试使用以下查询完成以下操作:

  • Dial根据表中包含的各种条件从表和组中获取所有记录
  • History通过唯一键 ( Dial.UIDand )将表连接到表,History.UID以返回一些无法从Dial表中获取的信息

一切工作正常,除了它没有从Dial表中返回 UID 为 0 的行(一旦处理了记录,这将在两个表中更新,但如果尚未处理,则保持为 0)。我希望将 UID 为 0 的所有记录的计数添加到 Total Avail 中。和 Total Eligible 列,基于 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
4

2 回答 2

0

Line History.DateTime > CONVERT(datetime,convert(char(8),getdate(),112))in WHERE“变成”LEFT JOIN History内部连接,因此结果集不包含表中没有相应条目的记录History。将其移至加入条件:

LEFT JOIN History History ON (Dial.UID = History.UID 
 AND History.DateTime > CONVERT(datetime,convert(char(8),getdate(),112)))
于 2013-05-18T14:07:16.690 回答
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表格中。但是,您left join使用上一次比较撤消History.DateTime. 当没有匹配的记录时,它将为 NULL。NULL 将使比较失败。您可以通过在子句中添加coalesce()oris null来解决此问题。where

另一个解决方法是在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,则可以通过转换为 a 来进行日期比较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 '-%'

它使查询更易于阅读。

于 2013-05-18T14:07:27.467 回答