我必须提供一个数据,其中列出了一个月内未见过的所有孩子。数据集中的每一行代表一个联系事件。我有两个程序 - 拉出满足“联系符合”标准的所有联系人事件,以及收回所有其他不符合联系标准的联系事件的联系事件。我需要的清单是所有孩子如何至少不符合联系标准一次。
这是我开始的数据集:
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
这三个孩子至少不符合要求一次。我无法弄清楚如何修改查询。任何帮助表示赞赏!谢谢!
答案 0 :(得分:1)
您可以使用group by
和having
子句执行此操作:
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_name
和Unit
。原因是EXCEPT
过滤了两个查询中相同的行。因此,如果您加入Child_Name
,Unit
&amp;在第一个查询中Contact_Date
,只有当第二个查询对同一个Child_Name
和Unit
具有相同的日期时才会过滤掉这些行,这不太可能是因为我读了你的问题