2010-04-21 7 views
3

J'ai une table avec trois colonnes remplies nommées "Nom", "Ville" et "Occupation". Je souhaite créer une nouvelle colonne dans le même tableau qui contient le nombre de personnes ayant la même occupation.Requête SQL avec regroupement par plusieurs colonnes

"Name" | "City" | "Occupation" 
------------------------------ 
Amy | Berlin | Plumber 
Bob | Berlin | Plumber 
Carol | Berlin | Lawyer 
David | London | Plumber 

Je veux avoir une table qui contient:

"Name" | "City" | "Occupation" | "Number" 
--------------------------------------- 
Amy | Berlin | Plumber  | 2 
Bob | Berlin | Plumber  | 2 
Carol | Berlin | Lawyer  | 1 
David | London | Plumber  | 1 

Comment la requête SQL qui crée les nouvelles colonnes doivent ressembler? Je veux réellement créer une nouvelle colonne dans la base de données que je peux accéder plus tard.

+0

I lire le titre une merveille pourquoi tu interroges tâtonnait ... sérieusement! – thecoshman

+0

dans vos tableaux ci-dessus, les lignes sont horizontales et les colonnes verticales. par exemple "amy - berlin - plombier" est une ligne, tandis que "" Nom "," Ville "et" Occupation "sont des colonnes –

Répondre

1

autojointure simple:

SELECT t0.Name, t0.City, t0.Occupation, COUNT(*) AS Number 
FROM sometable AS t0 
JOIN sometable AS t1 ON t1.Occupation=t0.Occupation 
GROUP BY t0.Name, t0.City, t0.Occupation 

Si Name est une clé primaire, vous pouvez tout groupe par cela seul lieu, puisque les autres colonnes auraient une dépendance fonctionnelle sur elle. Bien sûr, Name ne serait normalement pas une très bonne clé primaire.

(Vous pourriez avoir besoin COUNT(*)-1 si vous voulez que le nombre de autres personnes qui font le travail plutôt que le total On ne sait pas,.. Les chiffres dans votre exemple ne concordent pas de toute façon)

Si vous doit changer votre schéma (et je ne recommanderais pas ce genre de dénormalisation, sauf si vous êtes absolument certain que vous avez besoin, voir les commentaires), vous pouvez le faire une mise à jour apparteniez à la sous-requête de Michael:

ALTER TABLE sometable ADD COLUMN Number INTEGER NOT NULL; 
UPDATE sometable AS t0 JOIN (
    SELECT Occupation, COUNT(*) AS Number 
    FROM sometable 
    GROUP BY Occupation 
) AS t1 ON t1.Occupation=t0.Occupation 
SET t0.Number= t1.Number; 
+0

Merci, je voudrais cependant avoir le numéro écrit en ligne parce que ce serait probablement cher pour faire une jointure chaque fois que j'ai besoin du numéro – Christian

+2

Optimisation prématurée: ne changez pas votre schéma jusqu'à ce que vous ayez besoin de le faire.Avec un index sur 'Occupation' ce sera très rapide, je peux faire une auto-jointure similaire - et La requête de Michael est encore plus rapide (bien que pour les résultats LIMITES, c'est plus lent), ce qui dépend de ce que vous avez dans votre base de données, mais avec des index appropriés sera rapide – bobince

+0

J'ai 20 000 000 entrées dans ma base de données et je cherche à faire 100 000 requêtes, j'ai besoin de performances. – Christian

3
select tbl.name, tbl.city, tbl.occupation, x.number 
from tbl 
join 
(
    select occupation, count(*) as number 
    from tbl 
    group by occupation 
) as x on x.occupation = tbl.occupation 
Questions connexes