Besoin de résultats supérieurs à 1 à 1

J'ai une requête et je tire les résultats des users correspondant à un pays, c'est ma requête jusqu'à présent:

SELECT UserColder.ContactName, CountryUser.[User ID], Country.Name, Country.ID FROM dbo.Country INNER JOIN dbo.CountryUser ON Country.ID = CountryUser.[Foreign ID] INNER JOIN dbo.UserColder ON CountryUser.[User ID] = UserColder.ID 

Mais ce que je veux faire est de faire en sorte qu'il ne renvoie qu'un pays a plusieurs ID user. Donc, si mes données étaient.

 Bob United States Tom United States Steve United Stated Frank Canada Billy Canada Lou China 

Je voudrais que les résultats soient les

 Bob Tom Steve 

pour les États-Unis, et

 Frank Billy 

pour le Canada, mais pas pour la Chine parce qu'elle n'a qu'un seul user lié. Mais abattre l'autre parce que les États-Unis et le Canada ont des créateurs puis un user lié. Serait-ce possible dans une requête?

Merci!

Je ne suis pas sûr de la syntaxe sans la database en face de moi, mais la fonction de classment serait bon pour cela:

 SELECT * FROM ( SELECT UserColder.ContactName, CountryUser.[User ID], Country.Name, Country.ID, COUNT(UserColder.ContactName) OVER (PARTITION BY Country.ID) _RANK FROM dbo.Country INNER JOIN dbo.CountryUser ON Country.ID = CountryUser.[Foreign ID] INNER JOIN dbo.UserColder ON CountryUser.[User ID] = UserColder.ID ) A WHERE A._RANK > 1 

Edité grâce aux commentaires 🙂 Également ajouté preuve de concept:

 SELECT * INTO #TEMP FROM ( SELECT 'UK' Country, 'Dave' Name UNION SELECT 'UK' Country, 'Bob' Name UNION SELECT 'UK' Country, 'Alex' Name UNION SELECT 'China' Country, 'Mike' Name UNION SELECT 'Holland' Country, 'Paul' Name UNION SELECT 'Holland' Country, 'James' Name ) A SELECT * FROM #TEMP SELECT * FROM (SELECT Country, Name, Count(Name) OVER (PARTITION BY Country) _RANK FROM #TEMP) A WHERE A._RANK > 1 

Essaye ça:

 SELECT UserColder.ContactName, CountryUser.[User ID], Country.Name, Country.ID FROM dbo.Country INNER JOIN dbo.CountryUser CU ON Country.ID = CountryUser.[Foreign ID] INNER JOIN dbo.UserColder ON CountryUser.[User ID] = UserColder.ID WHERE (SELECT COUNT(CountryUser.[User ID]) FROM dbo.CountryUser WHERE [Foreign ID] = CU.[Foreign ID]) > 1 

Je ne peux pas parsingr la déclaration pour être sûr que la syntaxe est correcte, mais s'il vous plaît essayez et faites le moi savoir.

Les éléments suivants sélectionneront uniquement les lignes de CountryUser s'il existe une autre ligne avec le même ID de pays, mais un autre ID user. c'est-à-dire plus d'un identifiant d'user pour ce pays:

 SELECT UserColder.ContactName, CountryUser.[User ID], Country.Name, Country.ID FROM dbo.Country INNER JOIN dbo.CountryUser ON Country.ID = CountryUser.[Foreign ID] INNER JOIN dbo.UserColder ON CountryUser.[User ID] = UserColder.ID WHERE EXISTS (SELECT NULL FROM CountryUser CU2 WHERE CU2.[Foreign ID] = CountryUser.[Foreign ID] AND CU2.[User ID] <> CountryUser.[User ID]) 

Cela devient fastidieux si vous devez insert les informations user, mais cela fonctionnerait-il? Il renverra la list des pays. Il est possible d'append les informations de l'user, mais la requête devient en quelque sorte brute

 SELECT COUNT(*) count, Country.Name, Country.ID FROM dbo.Country INNER JOIN dbo.CountryUser ON Country.ID = CountryUser.[Foreign ID] INNER JOIN dbo.UserColder ON CountryUser.[User ID] = UserColder.ID GROUP BY Country.ID, Country.Name HAVING COUNT(*) > 1 

Vous pouvez utiliser la clause HAVING

Par exemple: SELECT SalesOrderID, SUM (LineTotal) AS Sous-total FROM Ventes.SalesOrderDetail GROUP BY SalesOrderID HAVING SOMME (LineTotal)> 100000.00 COMMANDE PAR SalesOrderID

 SELECT UserColder.ContactName, CountryUser.[User ID], Country.Name, Country.ID FROM dbo.Country INNER JOIN dbo.CountryUser ON Country.ID = CountryUser.[Foreign ID] INNER JOIN dbo.UserColder ON CountryUser.[User ID] = UserColder.ID where Country.ID in (select CountryID from CountryUser group by CountryID having count(countryid)>1) 
 ;WIth counsortinges AS ( SELECT UserColder.ContactName ,CountryUser.[User ID],Country.Name,Country.ID ,COUNT(UserColder.ContactName) OVER (PARTITION BY Country.ID) AS num_people FROM dbo.Country INNER JOIN dbo.CountryUser ON Country.ID = CountryUser.[Foreign ID] INNER JOIN dbo.UserColder ON CountryUser.[User ID] = UserColder.ID ) SELECT ContactName ,[User ID] FROM counsortinges WHERE num_people > 1