根据2个不同的标准选择数据

时间:2017-01-24 19:25:17

标签: sql select sql-server-2012

我有一张看起来像这样的桌子......

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.我只寻找那些特定的。

3 个答案:

答案 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))