Accessで次のようなテーブル「member」があったとします。
| id | name | roomid | weight | date |
|---|---|---|---|---|
| 1 | Ito | 1 | 60 | 2013/1/1 |
| 2 | Abe | 1 | 62 | 2013/1/1 |
| 3 | Sato | 2 | 61 | 2013/1/1 |
| 4 | Eda | 2 | 68 | 2013/1/1 |
| 5 | Ito | 1 | 65 | 2013/7/1 |
ある学校の体重の管理簿だと考えてください。
roomidが教室番号です。weightが体重で、dateがそれを量った日です。
このテーブルを使って教室毎の人数を数えてください。
単純に数えるには次のようになります。
SELECT roomid, COUNT(name) AS ct
FROM member
GROUP BY roomid;
FROM member
GROUP BY roomid;
しかしこれでは正しくありません。
ポイントはIto君が体重を2回図ったのでレコードが2個ある点です。
単純に数えると2名とカウントしてしまいます。
まず重複を除きます。
SQLだと次のようになります。
SELECT roomid, name
FROM member
GROUP BY roomid, name;
FROM member
GROUP BY roomid, name;
教室と名前でグループ化すると重複はなくなります。
| roomid | name |
|---|---|
| 1 | Ito |
| 1 | Abe |
| 2 | Sato |
| 2 | Eda |
次にこれを使ってカウントします。
SQLはテーブルの代わりに別のSQLの実行結果を使うことができます。
SELECT roomid, COUNT(name) AS ct
FROM (
SELECT roomid, name
FROM member
GROUP BY roomid, name
)
GROUP BY roomid;
FROM (
SELECT roomid, name
FROM member
GROUP BY roomid, name
)
GROUP BY roomid;
| roomid | ct |
|---|---|
| 1 | 2 |
| 2 | 2 |

コメント