我有一张看起来像这样的桌子......
ClientNo ApptStrt ApptEnd Type
1774 1/27/2016 1/27/2016 A
1774 1/27/2016 1/27/2016 B
1174 2/2/2016 2/2/2016 B
186 1/12/2016 1/12/2016 A
186 1/11/2016 1/11/2016 B
此表包含数万条与上述数据类似的记录。我的目标是找到同时具有类型A和B的所有客户端记录,仅适用于A和B的ApptStrt相同的情况。
在这种情况下,客户端1774具有类型A& B - 恰好两个ApptStrt日期是相同的,不像ClientNo 186具有不同的ApptStrt日期,即使它们都有两种类型。
期望的最终结果
ClientNo ApptStrt ApptEnd Type
1774 1/27/2016 1/27/2016 A
1774 1/27/2016 1/27/2016 B
'这就是我一直在尝试做的事情
Select x1.ClientNO, x1.ApptStrt, x1.ApptEnd, x1.Type from TblClientRecords X1
inner join tblClientRecords X2
On x1.appStrt = x2.appStrt
where x1.type in (A,B)
我试图更具体 - 特别是对于TYPE,因为还有其他类型。因此,最好以某种方式确保它只查找A和B.我只寻找那些特定的。
答案 0 :(得分:1)
您可以group by
客户端否和apptstrt并检查两种类型是否存在。
select clientno,apptstrt
from tblClientRecords
group by clientno,apptstrt
having count(case when type = 'A' then 1 end) >= 1
and count(case when type = 'B' then 1 end) >= 1
要获取完整行,请将之前的结果加入原始表。
select t.*
from tblClientRecords t
join (
select clientno,apptstrt
from tblClientRecords
group by clientno,apptstrt
having count(case when type = 'A' then 1 end) >= 1
and count(case when type = 'B' then 1 end) >= 1
) x on x.clientno=t.clientno and x.apptstrt=t.apptstrt
答案 1 :(得分:1)
以上作品但似乎过于复杂。 如果您将表连接到自身并限制输出 - 您可以在不必处理GROUP_BY子句的情况下获得此结果。 这也是一般情况,然后可以应用于很多情况。
SELECT
*
FROM
tblClientRecords as A
JOIN
tblClientRecords AS B
ON
A.ClientNo = B.ClientNo
AND A.ApptStrt = B.ApptStrt
AND A.[Type] = A
AND B.[Type] = B
答案 2 :(得分:1)
您已在 appStrt 上加入了两个别名,但还需要记住 clientno 。然后,您还可以添加x1中 type 不等于x2中 type 的要求。因为您可以拥有比 A 和 B 更多的类型,您需要在(A,B)中为x2重复条件 x1.type好。
我个人建议使用 exists 而不是 join 的条件:
select x1.ClientNO, x1.ApptStrt, x1.ApptEnd, x1.Type from TblClientRecords X1
where x1.type in (A,B) and exists (select * from tblClientRecords X2
where x1.ClientN = x2.ClientN and x1.appStrt = x2.appStrt and x1.type <> x2.type
and x2.type in (A,B))