求条SQL语句:与统计性别与年龄分布有关的(30分)

  • 主题发起人 主题发起人 py6530
  • 开始时间 开始时间
P

py6530

Unregistered / Unconfirmed
GUEST, unregistred user!
我有个表,记录户口有关数据,其中有"出生日期,性别"字段 <br>现在想统计 各年龄段的 人数,性别<br>(如 0-5岁,5-10,... 这间隔年数 由用户定 隔5年或10年等)<br>即使不能同时统计出人数,性别 分开统计 也行<br>求这SQL语句该怎写
 
期待中,给你顶一下!
 
呵呵,这个我做过,要写个存储过程,传个参数,这个参数就是由用户自定义的间隔年龄。<br>在存储过程中通过while 做个循环,组建各年龄段的查询子句,最后合并SQL语句即可。<br>例:--@start_year 开始年龄 &nbsp; @len_num 间隔数 &nbsp;@max_year 最大年龄<br>&nbsp; &nbsp; --@sql_sub &nbsp;年龄段子句,用于拼接<br><br>&nbsp; &nbsp; set @sql_sub=''<br>&nbsp; &nbsp; while @start_year&lt;@max_year<br>&nbsp; &nbsp; begin<br>&nbsp; &nbsp; &nbsp; &nbsp; set @sql_sub=@sql_sub+' sum(case when Datediff(yy,birthday,getdate()) between '+convert(varchar(3),@start_year+1) + ' and '+convert(varchar(3),@start_year+@len_num) then 1 else 0 end)+','<br>&nbsp; &nbsp; &nbsp; &nbsp; set @start_year=@start_year+@len_num<br>&nbsp; &nbsp; &nbsp; &nbsp; if @start_year&gt;@max_year<br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; break<br>&nbsp; &nbsp; &nbsp; &nbsp; else<br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; continue &nbsp;<br>&nbsp; &nbsp; end<br><br>--主要部分就上面,相信你如果以统计男、女人数,再在上面的case语句的条件部分加入sex='男' 或者 sex='女',就可以分别统计出某个年龄段内的男、女人数了。
 
因为你的参数是要动态改变的,所以应该用存储过程解决比较好。<br>给你个大致思路吧<br>表1 是原始数据表,包含字段 出生日期,性别<br>第一步<br>建一个视图<br>CREATE VIEW 视图1 AS<br>Select Count(性别) as 人数, YEAR(GETDATE()) - Year(出生日期) + 1 as 年龄, 性别 From 表1 Group by 性别, YEAR(GETDATE()) - Year(出生日期) + 1<br>视图建好后,打开视图,就可以得到各年龄男女的分布人数。<br><br>第二步,建一个存储过程<br>CREATE PROCEDURE 过程1<br>&nbsp; &nbsp;@Rang &nbsp; int<br>&nbsp;AS<br>set nocount on<br>Select Sum(人数) as 人数, 年龄 / @Rang as 范围, 性别 &nbsp;From 视图1 Group by 性别, 年龄 / @Rang<br><br>Go<br><br>得到的结果集中,对每个范围均有两个记录(除非这个年龄段某个性别人数为0),一个是男的,一个是女的,如果要显示成 年龄段,人数,男,女的方式 ,再做个 Join 就可以了。<br><br>年龄段是以 0至N的方式显示的,比如 @Rang=5, 表示是0: 0-4, 1: 表示 5-9, &nbsp;如果要范围从1开始计数,可以用 年龄 / @Rang &nbsp;+ 1<br><br>你说的0-5, 5-10,那5岁到底属于哪个范围,不明白。
 
这应该是行列转换吧?
 
多人接受答案了。
 
后退
顶部