2015-10-22 1 views
1

J'ai 36 colonnes d'une table, mais l'une des colonnes ont des données plusieurs fois comme ci-dessousfonction de type countif dans SQL où nombre total pourrait être récupéré dans un autre colonne

ID  Name  Ref 
abcd john doe 123 
1234 martina  100 
123x brittany 123 
ab12 joe   101 

et je veux des résultats comme

ID  Name  Ref cnt 
abcd john doe 123 2 
1234 martina  100 1 
123x brittany 123 2 
ab12 joe   101 1 

comme 123 est apparu deux fois que je veux montrer dans la colonne 2 cnt et ainsi de suite

+1

Quelle base de données (MySQL, SQL-Server, Oracle etc.) utilisez-vous? –

Répondre

0
select ID, Name, Ref, (select count(ID) from [table] where Ref = A.Ref) 
from [table] A 

Edit: Comme mentionné dans les commentaires ci-dessous, cette approche peut ne pas être le plus efficace dans tous les cas, mais devrait être suffisant sur des tables raisonnablement petites.

Dans mes tests:

  • une table de 5.460 dossiers et 976 distincts valeurs 'Ref' retourné en moins de 1 seconde.
  • une table de 600 831 enregistrements et 8 335 valeurs 'Ref' distinctes retournées en 6 secondes.
  • une table de 845 218 enregistrements et 15 147 valeurs distinctes 'Ref' retournées en 13 secondes.
+0

Jetez un coup d'oeil à cet article sur comment [optimiser sous-requêtes corrélées] (https://en.wikipedia.org/wiki/Correlated_subquery#Optimizing_correlated_subqueries) – danihp

+0

@danihp Intéressant. Je le garderai à l'esprit si je trouve que la performance est un problème, mais je ne suis pas sûr que cela justifie une rétrogradation? Original Post n'a jamais fait allusion à la taille de la table. FWIW J'ai obtenu un resultset complet en moins d'une seconde sur une table de 5 460 enregistrements et 976 valeurs d'équivalents «Ref» distincts, et 6 secondes pour une table de 600 831 enregistrements avec 8 335 valeurs «Ref» équivalentes distinctes. – user2585435

+0

Intéressant. Techniquement, je ne peux pas supprimer downvote sauf si vous modifiez votre réponse. Peut-être pouvez-vous inclure ces chiffres par rapport aux nombres pour une requête non corrélée dans votre réponse. – danihp

0

Vous devez fournir marque SQL pour connaître les capacités:

1) Si votre DB prend en charge window functions:

Select 
    *, 
    count(*) over (partition by ref) as cnt 
from your_table 

2) Dans le cas contraire:

Select 
    T.*, G.cnt 
from 
    (select * from your_table) T inner join 
    (select count(*) as cnt from your_table group by ref) G 
    on T.ref = G.ref 
+0

merci beaucoup pour l'aide – Sandeep

0

Vous pouvez utiliser COUNT avec OVER en suivant:

QUERY

select ID, 
     Name, 
     ref, 
     count(ref) over (partition by ref) cnt 
from #t t 

données-échantillon

create table #t 
(
ID NVARCHAR(400), 
Name NVARCHAR(400), 
Ref INT 
) 

insert into #t values  
('abcd','john doe', 123), 
('1234','martina',  100), 
('123x','brittany', 123), 
('ab12','joe',   101) 
+0

Merci beaucoup pour une réponse si rapide – Sandeep

+0

Hey comment puis-je l'accepter comme correct ans?est-ce que je peux guider comme incapable de trouver n'importe quelle option comme ceci et ceci était ma première question – Sandeep