回答:
これはうまくいくはずです:
SELECT age, count(age)
FROM Students
GROUP by age
idも必要な場合は、上記のようにサブクエリとして上記を含めることができます。
SELECT S.id, S.age, C.cnt
FROM Students S
INNER JOIN (SELECT age, count(age) as cnt
FROM Students
GROUP BY age) C ON S.age = C.age
Oracleを使用している場合は、アナリティクスと呼ばれる機能が役立ちます。次のようになります。
select id, age, count(*) over (partition by age) from students;
Oracleを使用していない場合は、カウントに戻って参加する必要があります。
select a.id, a.age, b.age_count
from students a
join (select age, count(*) as age_count
from students
group by age) b
on a.age = b.age
これが別の解決策です。これは非常に単純な構文を使用しています。受け入れられたソリューションの最初の例は、古いバージョンのMicrosoft SQL(つまり2000)では機能しませんでした。
SELECT age, count(*)
FROM Students
GROUP by age
ORDER BY age
「年齢」列のデータに同様のレコードがある場合(つまり、多くの人が25歳で、他の多くが32歳など)、各生徒に正しい数を揃えるのに混乱が生じます。それを避けるために、学生IDのテーブルにも参加しました。
SELECT S.id, S.age, C.cnt
FROM Students S
INNER JOIN (SELECT id, age, count(age) as cnt FROM Students GROUP BY student,age)
C ON S.age = C.age *AND S.id = C.id*