• ベストアンサー

年齢別に分類するSQL

従業員名簿があります。 氏名|年齢 これを 18歳から25歳 12人 26歳から30歳 5人 31歳から・・・  のように年齢別にカウントする簡単な方法についてアドバイスください。 #DBはアクセスです。

質問者が選んだベストアンサー

  • ベストアンサー
noname#140971
noname#140971
回答No.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)を設ければ済むこと。 このようにクエリにマジックナンバーを埋め込むとメンテナンス上で重大な問題を残すことにも・・・。

その他の回答 (2)

  • t-ka
  • ベストアンサー率28% (14/50)
回答No.2

一例です。 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)) ;

  • CHRONOS_0
  • ベストアンサー率54% (457/838)
回答No.1

年齢から分類したいグループを算出する式フィールドを設け その式フィールドをグループに指定して集計すればいいのです 年齢がどのように格納されているのかわかりませんが 数値型なら グループ:IIf(年齢 between 18 and 25,"A",IIf(年齢 between 26 and 30,"B","C")) 生年月日などの場合も考え方は同じです

関連するQ&A