Sélectionnez les lignes avec la même colonne A mais la colonne B différente

ID Zip Room ----------- ---------- ------ 317 94087 S105 318 94087 L603 1739 94404-1801 L603 1823 94401-2129 L603 1824 94401-2129 L603 2135 94404-1801 L603 2268 95136-1459 S604 2269 95136-1459 S604 3704 92673-6417 L402 4479 93454-9670 L402 4480 93454-9670 L402 4782 92395-4681 L402 4783 92395-4681 L402 4852 92886-4411 L402 4853 92886-4411 L402 4959 92673-6417 L402 5153 91773-4028 L402 5202 91773-4028 L402 5211 91765-2959 L402 5212 91765-2959 L402 5388 92336-0605 L402 5392 92336-0605 L402 5727 92870 L402 5728 92870 L402 5831 92557 L402 5916 92557 L402 

Comment puis-je sélectionner les ID qui ont le même zip mais une pièce différente?

Dans le tableau ci-dessus, je veux que le résultat soit:

 ID Zip Room ----------- ---------- ------ 317 94087 S105 318 94087 L603 

À l'aide de SQL Server 2008

Vous pouvez utiliser EXISTS :

 SELECT ID, Zip, Room FROM dbo.Table t1 WHERE EXISTS ( SELECT 1 FROM dbo.Table t2 WHERE t2.Zip = t1.Zip AND t2.Room <> t1.Room ) 
 select * from table t1 join table t2 on t1.Zip = t2.Zip and t1.Room <> t2.Room 

Vous pouvez utiliser les fonctions d'agrégation de window MIN() et MAX() pour get, de manière correspondante, le minimum et le maximum de la Room par Zip à Zip , puis sélectionner uniquement les lignes où ces valeurs diffèrent. Ici:

 WITH MinMax AS ( SELECT *, MinRoom = MIN(Room) OVER (PARTITION BY Zip), MaxRoom = MAX(Room) OVER (PARTITION BY Zip) FROM atable ) SELECT ID, Zip, Room FROM MinMax WHERE MinRoom <> MaxRoom ;