1

我必须提取一个数据,其中列出了一个月内未见过的所有孩子的名单。数据集中的每一行代表一个联系事件。我有两个程序 - 拉出所有满足“接触满足”标准的接触事件,一个带回所有其他不符合接触标准的接触事件。我需要的清单是所有孩子至少一次没有达到联系标准。

这是我开始的一个数据集:

Child_Name  Unit    Contact_Date    Contact_Method  Contact_Result  Participant
Chiddick    P5J 5/17/2013           Face To Face    Contacted                 No
Chiddick    P5K 5/1/2013                 Phone            Contacted               No
Chiddick    P5K 5/2/2013                 Phone            Contacted               No
Chiddick    P5K 5/3/2013                Face To Face    Attempted                 No
Chiddick    P5K 5/6/2013                  Phone           Contacted               No
Chiddick    P5K 5/7/2013                Face To Face    Attempted                 No
Melgar  P5F 5/13/2013               Face To Face    Attempted                Yes
Melgar  P5F 5/13/2013                 Phone           Attempted              Yes
Melgar  P5F 5/15/2013             Face To Face  Attempted                Yes
Silva   P5G 5/8/2013              Face To Face  Attempted                 No
Silva   P5G 5/31/2013             Face To Face  Attempted                 No
Bennett     P5E 5/1/2013              No Contact    No Contact
Bennett     P5E 5/8/2013              Face To Face  Contacted               Yes
Bennett     P5E 5/17/2013           Face To Face    Contacted                 Yes
Abreu     P5G   5/14/2013           Face To Face              Contacted               Yes
Abreu      P5G  5/29/2013            Face To Face   Attempted                 Yes

此查询适用于遇到的联系人事件:

SELECT
Child_Name,
Unit,
Contact_Date,
Contact_Method,
Contact_Result,
Participant
FROM [DimContacts_Child]
where Unit in('P5C','P4C','P5L','P5D','P5F','P5G','P5E','P5A','P5K','P5J')
and (Contact_Date>='2013-05-01' AND Contact_Date <='2013-05-31')
and **(Contact_Method ='Face To Face')AND (Contact_Result<>'Attempted')AND (Participant='Yes');**

结果:

Child_Name  Unit    Contact_Date    Contact_Method  Contact_Result  Participant
Bennett P5E 5/8/2013               Face To Face Contacted                 Yes
Bennett P5E 5/17/2013               Face To Face    Contacted                 Yes
Abreu   P5G 5/14/2013              Face To Face Contacted                 Yes

此查询是未满足的联系事件:

SELECT
Child_Name,
Unit,
Worker_Name
Contact_Date,
Contact_Method,
Contact_Result,
Participant
FROM DimContacts_Child]
where Unit in('P5C','P4C','P5L','P5D','P5F','P5G','P5E','P5A','P5K','P5J')
and (Contact_Date>='2013-05-01' AND Contact_Date <='2013-05-31')
and **not** **((Contact_Method='Face To Face')AND (Contact_Result<>'Attempted')AND (Participant='Yes'));**

结果:

Child_Name  Unit    Contact_Date    Contact_Method  Contact_Result  Participant
Chiddick    P5J 5/17/2013              Face To Face Contacted                 No
Chiddick    P5K 5/1/2013                  Phone           Contacted               No
Chiddick    P5K 5/2/2013                  Phone           Contacted               No
Chiddick    P5K 5/3/2013               Face To Face Attempted                 No
Chiddick    P5K 5/6/2013                   Phone              Contacted               No
Chiddick    P5K 5/7/2013               Face To Face Attempted                 No
Melgar  P5F 5/13/2013                Face To Face   Attempted                Yes
Melgar  P5F 5/13/2013                 Phone           Attempted              Yes
Melgar  P5F 5/15/2013              Face To Face Attempted                Yes
Silva   P5G 5/8/2013               Face To Face Attempted                 No
Silva   P5G 5/31/2013              Face To Face Attempted                 No
Bennett P5E 5/1/2013               No Contact   No Contact  
Abreu   P5G 5/29/2013              Face To Face Attempted                 Yes

如果您注意到 Bennett 和 Abreu 是唯一满足联系标准的孩子,则在该月至少会面一次。我需要的是一份在所有接触事件中至少有一次不满足标准的孩子名单。

这就是我需要的:

Child_Name   Unit
Chiddick     P5J
Melgar   P5F
Silva    P5G

这三个孩子至少有一次不符合要求。我不知道如何为此修改查询。任何帮助表示赞赏!谢谢!

4

2 回答 2

1

您可以使用group byandhaving子句执行此操作:

SELECT Child_Name, Unit
FROM DimContacts_Child
where Unit in ('P5C','P4C','P5L','P5D','P5F','P5G','P5E','P5A','P5K','P5J') and
      (Contact_Date >= '2013-05-01' AND Contact_Date <='2013-05-31')
group by Child_Name, Unit
having sum(case when (Contact_Method='Face To Face') AND
                     (Contact_Result <> 'Attempted') AND
                     (Participant='Yes')
                then 1 else 0 end) = 0;

聚合计算当月“有效”联系人的数量。如果有,则总和大于0。如果没有,则总和为0,并且孩子在结果集中。

唯一的问题是孩子和单位之间的关系。如所写,查询查看每个单元中的联系人。您可能希望unitgroup by, 中删除以仅基于每个孩子获得结果(我将其包括在内,因为它在您想要的结果集中)。

于 2013-06-29T23:21:23.030 回答
0

你应该使用EXCEPT. 我不会复制您上面的所有代码,而是复制以下内容:

SELECT Child_name, Unit FROM <THE QUERY WITH CRITERION NOT MET>
EXCEPT
SELECT Child_name, Unit FROM <THE QUERY WITH CRITERION MET>

这两个查询应该有相同数量的列;在您的示例中似乎就是这种情况。

为了使它起作用,您还应该只比较不应该相同的列。

IE。在您的情况下,该SELECT子句可能应该只包含Child_nameand Unit。这样做的原因是EXCEPT过滤两个查询中的相同行。因此,如果您在第一个查询中包含Child_Name, Unit& Contact_Date,则只有在第二个查询具有相同的日期时才会过滤掉行Child_NameUnit,这在我阅读您的问题时不太可能。

于 2013-06-29T23:09:14.437 回答