mysql根据出生日期统计各年龄段男女人数
生活随笔
收集整理的這篇文章主要介紹了
mysql根据出生日期统计各年龄段男女人数
小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
表格名稱 user, 字段 id, sex ( M 表示男, F表示 女), birthday出生日期, 沒有 age字段
其中 ROUND(DATEDIFF(CURDATE(), birthday)/365.2422) 是獲得 年齡
CASE WHEN的格式是:
CASEWHEN ( 條件) THEN 結(jié)果WHEN ( 條件) THEN 結(jié)果WHEN ( 條件) THEN 結(jié)果 END SELECT nnd as ageRange,sex,count(*) as count from(SELECTCASEWHEN ROUND(DATEDIFF(CURDATE(), people_birthday)/365.2422) >= 0and ROUND(DATEDIFF(CURDATE(), people_birthday)/365.2422) <= 12 THEN '0-12歲'WHEN ROUND(DATEDIFF(CURDATE(), people_birthday)/365.2422) >= 13 and ROUND(DATEDIFF(CURDATE(), people_birthday)/365.2422) <= 17 THEN '13-17歲'WHEN ROUND(DATEDIFF(CURDATE(), people_birthday)/365.2422) >= 18 and ROUND(DATEDIFF(CURDATE(), people_birthday)/365.2422) <= 22 THEN '18-22歲'WHEN ROUND(DATEDIFF(CURDATE(), people_birthday)/365.2422) >= 23and ROUND(DATEDIFF(CURDATE(), people_birthday)/365.2422) <= 30 THEN '23-30歲'WHEN ROUND(DATEDIFF(CURDATE(), people_birthday)/365.2422) >= 31 and ROUND(DATEDIFF(CURDATE(), people_birthday)/365.2422) <= 59 THEN '31-59歲'WHEN ROUND(DATEDIFF(CURDATE(), people_birthday)/365.2422) >= 60 THEN '60歲以上'END as nnd,people_sex as sexfrom people_info_sync ) a GROUP BY nnd,sex;結(jié)果:
存在的缺點(diǎn): 因?yàn)槭鞘褂?group by的方法, 所以如果沒有記錄的話, 是不會(huì)返回?cái)?shù)據(jù)的,
除非你用 left join 新建一張表來存 “0-12歲”,“13-17歲”,“18-22歲”,“23-30歲”,“31-59歲”,"60歲以上"這些數(shù)據(jù), 然后使用 左連接 left join , 這樣就能保證一定會(huì)有這些數(shù)據(jù)。。。但你的組長是無論如何也不會(huì)允許你這么干的哈哈。。
寫了一個(gè)后臺(tái)處理的方法, 可以參考下
/*** sql查詢使用Group By方法,如果數(shù)據(jù)庫本身沒有那條記錄的話,就不會(huì)返回相應(yīng)的總數(shù),所以需要定死數(shù)組,再通過遍歷的方式去查找* @return*/public List<CountAgeDto> countAge(){//這里就不能用 new String[]{"男","女"} 了,要和你數(shù)據(jù)庫查出來的結(jié)果一樣才行String[] sexArr = new String[]{"F","M"};String[] ageArr = new String[]{"0-12歲","13-17歲","18-22歲","23-30歲","31-59歲","60歲以上"};//從數(shù)據(jù)庫獲得數(shù)據(jù), 這個(gè)countAge()方法要自己寫,就執(zhí)行上面的sql語句List<CountAgeDto> dataList = peopleInfoSyncDao.countAge();//首先初始化List<CountAgeDto> countAgeDtoList = new ArrayList<>();for(String sex : sexArr){for(String age: ageArr){CountAgeDto countAgeDto = new CountAgeDto();countAgeDto.setAgeRange(age);countAgeDto.setSex(sex);//初始化為0, 確保都有值countAgeDto.setCount(0L);//遍歷數(shù)據(jù)庫查出來的集合if(dataList != null && dataList.size() > 0){for(CountAgeDto d : dataList){//如果和當(dāng)前的sex和age相同,就說明count有值,則退出if(d.getAgeRange().equals(age) && d.getSex().equals(sex)){countAgeDto.setCount(d.getCount());break;}}}countAgeDtoList.add(countAgeDto);}}return countAgeDtoList;}其中CountAgeDto是:
public class CountAgeDto {/*** 總數(shù)*/private Long count;/*** 年齡段*/private String ageRange;/*** 性別*/private String sex;public Long getCount() {return count;}public void setCount(Long count) {this.count = count;}public String getAgeRange() {return ageRange;}public void setAgeRange(String ageRange) {this.ageRange = ageRange;}public String getSex() {return sex;}public void setSex(String sex) {this.sex = sex;}@Overridepublic String toString() {return "CountAgeDto{" +"count=" + count +", ageRange='" + ageRange + '\'' +", sex='" + sex + '\'' +'}';} }總結(jié)
以上是生活随笔為你收集整理的mysql根据出生日期统计各年龄段男女人数的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Redis数据库(四)哨兵和集群
- 下一篇: 精心分享7个办公软件,每一款都好用到爆