Sql 如何提取在特定字段中具有混合值的记录?
我正在运行SQL Server 2012,下面的表名为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
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值不相同。如前所述,我对其进行了调整,然后进行了测试,这两个查询都正常工作。看见