2010-07-02 7 views
2

J'ai une table d'utilisateurs contenant les colonnes suivantes:groupe SQL par - Sélectionnez les deux colonnes

| User_ID (int) | Name (varchar) | Age (int) | Experience_Level (int) | 

Je voudrais créer une requête SQL pour produire tous les ID des personnes qui ne sont pas uniques dans le combinaison d'âge et d'expérience.

Mon code à ce jour:

SELECT Count(*), User_ID FROM Users 
GROUP BY Age,Experience_Level 
HAVING Count(*) > 1 

Évidemment, cela est incomplet, ce regrouperons les utilisateurs non uniques, mais il ne me dira pas tous leurs User_IDs.

Merci d'avance pour votre aide!

Répondre

3

Voici une requête logique niée:

SELECT * 
FROM Users 
WHERE UserID not in 
(
SELECT MIN(UserID) 
FROM Users 
GROUP BY Age, Experience_Level 
HAVING COUNT(*) = 1 
) 
+0

Exactement ce que je cherchais, Merci beaucoup à vous monsieur. – pws5068

2

Puisque vous voulez des informations sur les groupes d'utilisateurs multiples, comment voulez-vous que ces données soient retournées? Dans une chaîne contenant une liste de valeurs user_id séparées par des virgules?

Vous n'avez pas marqué votre question avec la marque de base de données SQL que vous utilisez.

Si vous utilisez MySQL ou SQLite, vous pouvez utiliser la GROUP_CONCAT() fonction intégrée:

SELECT Count(*), GROUP_CONCAT(User_ID) AS User_List FROM Users 
GROUP BY Age,Experience_Level 
HAVING Count(*) > 1 

Par défaut, GROUP_CONCAT() sépare les valeurs par des virgules. Reportez-vous au manuel si vous voulez le formater autrement.

Il existe d'autres solutions pour d'autres fournisseurs SQL. Cette question a été soulevée à plusieurs reprises sur Stack Overflow:

+0

cuz l'omission de 'user_id' du GROUP BY, que le support de MySQL et SQLite colonnes cachées dans le grou p by (en supposant que l'OP ne reçoive pas d'erreur lors de l'exécution de la requête). –

+0

@OMG Ponies: En supposant que 'GROUP_CONCAT()' est un agrégat (et cela n'aurait pas beaucoup de sens dans le cas contraire), il n'y a aucune raison que cela ne marche pas sur d'autres SGBDR (en supposant qu'il existe quelque chose de similaire). –

+0

Désolé, j'aurais dû préciser, j'utilise MySQL. Je n'ai jamais entendu parler de Group_Concat mais la requête fonctionne. J'ai fini par utiliser la réponse de David B à des fins de séparation, mais j'ai aussi appris quelque chose! Merci! – pws5068

1
SELECT t.User_ID, t.Age, t.Experience_Level 
FROM Users t INNER JOIN 
    (SELECT Age, Experience_Level 
    FROM Users 
    GROUP BY Age, Experience_Level 
    HAVING Count(*) > 1) d ON t.Age = d.Age AND t.Experience_Level = d.Experience_Level 

script Test:

create table Users (
User_ID int, 
Name varchar(50), 
Age int, 
Experience_Level int 
) 

insert into Users (User_ID, Name, Age, Experience_Level) values (1, 'A', 33, 1) 
insert into Users (User_ID, Name, Age, Experience_Level) values (2, 'B', 37, 1) 
insert into Users (User_ID, Name, Age, Experience_Level) values (3, 'C', 33, 1) 
insert into Users (User_ID, Name, Age, Experience_Level) values (4, 'D', 35, 2) 
insert into Users (User_ID, Name, Age, Experience_Level) values (5, 'E', 33, 1) 
insert into Users (User_ID, Name, Age, Experience_Level) values (6, 'F', 35, 2) 
insert into Users (User_ID, Name, Age, Experience_Level) values (7, 'G', 18, 1) 
1

En théorie, ce que vous voulez est quelque chose comme ça, mais malheureusement SQL Server ne permet pas:

SELECT * FROM Users 
WHERE (Age, Experience_Level) IN 
(
    SELECT Age, Experience_Level 
    FROM Users 
    GROUP BY Age,Experience_Level 
    HAVING Count(*) > 1 
) 

Ainsi, au lieu, il faut se contenter de se joindre à une sous-requête:

SELECT Users.* FROM Users 
INNER JOIN 
(
    SELECT Age, Experience_Level 
    FROM Users 
    GROUP BY Age,Experience_Level 
    HAVING Count(*) > 1 
) subq 
    ON Users.Age = subq.Age 
    AND Users.Experience_Level = subq.Experience_Level