web-dev-qa-db-ja.com

SQLの各行の属性値の複数の出現をカウントする

私はmytableを次のように構成しており、各行のattributeの値の出現をカウントしたいと思います。

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

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

私は得るだけです

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

しかし、私が結果として欲しいのは

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

これを達成する方法は?

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

別のバージョン:

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)
;

分析/ウィンドウ関数を備えたデータベースのより良いバージョン:

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