SQL Server:检索至少一次不满足事件条件的行

时间:2013-06-29 23:05:48

标签: sql sql-server

我必须提供一个数据,其中列出了一个月内未见过的所有孩子。数据集中的每一行代表一个联系事件。我有两个程序 - 拉出满足“联系符合”标准的所有联系人事件,以及收回所有其他不符合联系标准的联系事件的联系事件。我需要的清单是所有孩子如何至少不符合联系标准一次。

这是我开始的数据集:

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

这三个孩子至少不符合要求一次。我无法弄清楚如何修改查询。任何帮助表示赞赏!谢谢!

2 个答案:

答案 0 :(得分:1)

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

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.如果不是,那么sum为0,并且子项在结果集中。

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

答案 1 :(得分: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_nameUnit。原因是EXCEPT过滤了两个查询中相同的行。因此,如果您加入Child_NameUnit&amp;在第一个查询中Contact_Date,只有当第二个查询对同一个Child_NameUnit具有相同的日期时才会过滤掉这些行,这不太可能是因为我读了你的问题