Sql 如何提取在特定字段中具有混合值的记录?

Sql 如何提取在特定字段中具有混合值的记录?,sql,sql-server,tsql,Sql,Sql Server,Tsql,我正在运行SQL Server 2012,下面的表名为StayDateInfo。 下表摘录如下: ResaID StayDate RoomCat 100 2018-03-01 STD 100 2018-03-02 STD 100 2018-03-03 STD 101 2018-04-15 STD 101 2018-04-16 STD 101 2018-04-17 DLX 101

我正在运行SQL Server 2012,下面的表名为
StayDateInfo
。 下表摘录如下:

ResaID    StayDate    RoomCat
100       2018-03-01   STD
100       2018-03-02   STD
100       2018-03-03   STD
101       2018-04-15   STD
101       2018-04-16   STD
101       2018-04-17   DLX
101       2018-04-18   DLX
此表可容纳约200万行

我需要从该表中提取所有3列,其中,
ResaID的
RoomCat
值对于每个
StayDate
都不相同

在上面的摘录中,
ResaID
101将需要在输出中,因为它的
RoomCat
具有混合值(STD和DLX)

如何编写我的
T-SQ
L查询以实现此目的?

使用连接:

SELECT
    DISTINCT ResaID, StayDate, RoomCat
FROM
    StayDateInfo
WHERE
    ResaID IN
    (
        SELECT
            first.ResaID
        FROM
            StayDateInfo first
            JOIN StayDateInfo second ON 
                first.ResaID = second.ResaID
                AND first.StayDate = second.StayDate
                AND first.RoomCat != second.RoomCat
    )
分组:

SELECT
  DISTINCT *
FROM
  StayDateInfo
WHERE
  ResaID IN
  (
    SELECT
      ResaID
    FROM
    (
      SELECT
          ResaID, StayDate, RoomCat
      FROM
          StayDateInfo
      GROUP BY
          ResaID, StayDate, RoomCat
    ) grouped
    GROUP BY
      ResaID, StayDate
    HAVING COUNT(1) > 1
  )

在下面的解决方案中,将实际表名替换为
@xyz

为我的测试输入数据-

declare @xyz table (ResaID    int, StayDate    date, RoomCat varchar(10))

insert into @xyz
select 100       ,'2018-03-01',   'STD' union all
select 100       ,'2018-03-02',   'STD' union all
select 100       ,'2018-03-03',   'STD' union all
select 101       ,'2018-04-15',   'STD' union all
select 101       ,'2018-04-16',   'STD' union all
select 101       ,'2018-04-17',   'DLX' union all
select 101       ,'2018-04-18',   'DLX'
解决方案-

SELECT
    *
FROM
@xyz AS X
INNER JOIN (
    SELECT ResaID FROM @xyz GROUP BY ResaID HAVING COUNT(DISTINCT RoomCat) > 1
    ) AS Y ON Y.ResaID = X.ResaID
这应该做到:

select ResaID 
from table 
group by ResaID 
having count(distinct RoomCat) > 1
试试这个:

 declare @tableA table(ResaID INT,StayDate DATETIME,RoomCat varchar(3))

    INSERT INTO @tableA
    SELECT 100,'2018-03-01','STD'
    union all
    SELECT 100,'2018-03-02','STD'
    union all
    SELECT 100,'2018-03-03','STD'
    union all
    SELECT 101,'2018-04-15','STD'
    union all
    SELECT 101,'2018-04-16','STD'
    union all
    SELECT 101,'2018-04-17','DLX'
    union all
    SELECT 101,'2018-04-18','DLX'


    select ResaId 
    from @tableA
    Group by ResaId
    Having COUNT(DISTINCT RoomCat)=2

您确定101应该在输出中,因为每个记录的
StayDate
不同吗?是的。基本上,我需要所有包含一种以上RoomCat类型的ResaID,而不考虑StayDate。它只检索ResaID列表。我还需要输出包括剩下的2列(StayDate和RoomCat),您要查找的称为
join
@user3115933,这是因为您提供的测试数据没有任何记录集,其中每个StayDate的RoomCat resid值不相同。如前所述,我对其进行了调整,然后进行了测试,这两个查询都正常工作。看见