dポイントプレゼントキャンペーン実施中!

従業員名簿があります。

氏名|年齢

これを

18歳から25歳 12人
26歳から30歳 5人
31歳から・・・ 

のように年齢別にカウントする簡単な方法についてアドバイスください。

#DBはアクセスです。

A 回答 (3件)

SELECT count(*) AS 人数 , '18から25' AS 年齢区分


  FROM 従業員名簿
  WHERE 年齢>=18 And 年齢<=25;

ANo.2 の方が回答されているように、このような単一Select文の結果を単一のセットにするには union しかないです。
ですから、単一Select文で実現するには少々工夫が必要です。

従業員名簿:
ID___氏名__________年齢
1____鈴木 一郎_______22
2____中村 主水_______26
3____木村 純一_______33
4____山田 太郎_______33

SELECT Count(*) AS 人数
FROM 従業員名簿
GROUP BY ((年齢>=18)*(年齢<=25)+(年齢>=26)*(年齢<=30)*2+(年齢>=31)*(年齢<=40)*3);

クエリ1:
人数
_____1
_____1
_____2

これじゃ、年齢区分が判りませんので、次のようにして年齢区分を生成する列を追加しなければなりません。

SELECT
CutStr("18~25/26~30/31~40","/",((年齢>=18)*(年齢<=25)+(年齢>=26)*(年齢<=30)*2+(年齢>=31)*(年齢<=40)*3)) AS 年齢区分,
Count(*) AS 人数
FROM 従業員名簿
GROUP BY ((年齢>=18)*(年齢<=25)+(年齢>=26)*(年齢<=30)*2+(年齢>=31)*(年齢<=40)*3);

クエリ2:
年齢区分___人数
18~25___________1
26~30___________1
31~40___________2

次の CutStr関数を標準モジュールに加えれば、こういう芸当も可能。

Public Function CutStr(ByVal TEXT As String, _
            ByVal Separator As String, _
            ByVal N As Integer) As String
  Dim strDatas() As String
  
  strDatas = Split("" & Separator & TEXT, Separator, , 0)
  CutStr = strDatas(N * Abs((N <= UBound(strDatas))))
End Function

さて、いずれにしろ、従業員名簿に列[年齢区分](=1,2,3)を設ければ済むこと。
このようにクエリにマジックナンバーを埋め込むとメンテナンス上で重大な問題を残すことにも・・・。
    • good
    • 0

一例です。



SELECT count(*) as 人数 , '18から25' as 種別
FROM meibo
WHERE (((meibo.年齢)>=18 And (meibo.年齢)<=25))
union
SELECT count(*) as 人数 , '26から31' as 種別
FROM meibo
WHERE (((meibo.年齢)>=26 And (meibo.年齢)<=30)) ;
    • good
    • 0

年齢から分類したいグループを算出する式フィールドを設け


その式フィールドをグループに指定して集計すればいいのです
年齢がどのように格納されているのかわかりませんが
数値型なら

グループ:IIf(年齢 between 18 and 25,"A",IIf(年齢 between 26 and 30,"B","C"))

生年月日などの場合も考え方は同じです
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!