web-dev-qa-db-fra.com

compter plusieurs occurrences de valeurs d'attribut pour chaque ligne en sql

J'ai un mytable structuré comme suit et je voudrais compter les occurrences de valeurs pour attribute dans chaque ligne:

id | attribute
--------------
1  | spam
2  | Egg
3  | spam

Avec

SELECT id, attribute, COUNT(attribute) FROM mytable GROUP BY attribute

Je reçois seulement

id | attribute | count
----------------------
1  | spam      | 2 
2  | Egg       | 1

Mais ce que j'aimerais en conséquence c'est

id | attribute | count
----------------------
1  | spam      | 2 
2  | Egg       | 1
3  | spam      | 2

Comment y parvenir?

5
Jochen Schwarze
select
  m1.id, 
  m1.attribute, 
  (select count(*) from mytable m2 where m2.attribute = m1.attribute) 
from
  mytable m1
;

Une autre version:

select
  m1.id,
  m1.attribute,
  m2.c
from
  mytable m1
  join (SELECT attribute, COUNT(attribute) as c FROM mytable GROUP BY attribute) m2
  on (m1.attribute = m2.attribute)
;

Une meilleure version pour les bases de données avec des fonctions analytiques/fenêtres:

select
  m1.id,
  m1.attribute,
  count(*) over (partition by m1.attribute)
from
  mytable m1
;
9
Balazs Papp