CSDN首页 空间 新闻 论坛 Blog 下载 读书 网摘 搜索 .NET Java 视频 接项目 求职 在线学习 买书 程序员 通知
英特尔®游戏设计大赛100美元现金周周送 专题改版:Java Web 专题
CSDN社区
搜索 收藏 打印 关闭
CSDN社区 >  Delphi >  VCL组件开发及应用

如何统计各个年龄段之间的人数?好象非常复杂。

楼主jiaxianglei(傻猫)2003-09-04 15:50:55 在 Delphi / VCL组件开发及应用 提问

我的Sql   server数据库中有一字段“出生日期”,为日期型。  
  我想打出的表格如下:  
                    男工           女工  
  16周岁  
  17周岁  
  .  
  .  
  .  
  大于45  
   
  我想统计16周岁,17周岁...大于45的男工及女工人数。  
  请问如何统计呢?如何根据出生日期计算年龄(周岁),然后再统计?  
  问题点数:100、回复次数:22Top

1 楼tiexinliu(铁心刘)回复于 2003-09-04 15:59:29 得分 0

写个存储过程,用临时表吧,用datediff可以算出年龄,然后往临时表中写数据,最后返回临时表Top

2 楼firetoucher(风焱)回复于 2003-09-04 15:59:39 得分 10

不能发长的帖子  
  select  
    sum(case   when   datediff(year,出生日期,getdate()     =   16   then   1   else   then   0   end)   as   16周岁.....  
  from   table  
  Top

3 楼sensory()回复于 2003-09-04 16:02:24 得分 10

datediff()你看帮助  
  select   datediff(date-now)   as   older   from   table  
  后再上表查  
  Top

4 楼firetoucher(风焱)回复于 2003-09-04 16:12:25 得分 10

select   c.年龄,a.男工,b.女工   from    
  (select   datediff(year,a.出生日期,getdate())   as   年龄,count(*)   as   男工  
  from   table  
  where     性别   =   '男'  
  group   by   datediff(year,a.出生日期,getdate())  
  order   by     datediff(year,a.出生日期,getdate()))a,  
  (select   datediff(year,a.出生日期,getdate())   as   年龄,count(*)   as   女工  
  from   table  
  where     性别   =   '女'  
  group   by   datediff(year,a.出生日期,getdate())  
  order   by     datediff(year,a.出生日期,getdate()))   b,  
  (select   distinct   datediff(year,出生日期,getdate())   as   '年龄'   from   table)   c  
  where    
  c.年龄*=a.年龄   and   c.年龄*=b.年龄  
  Top

5 楼samcrm(镜花水月)回复于 2003-09-04 16:16:59 得分 10

添加计算字段‘年龄’,在数据源(Table或Query等)的OnCalcFields中写:  
  DataSet['年龄']:=YearsBetween(DataSet['出生日期'],   now);Top

6 楼samcrm(镜花水月)回复于 2003-09-04 16:20:54 得分 0

然后select   Count(*)   from   表名   group   by   年龄   order   by   年龄   desc。Top

7 楼wdsimon(我是谁?)回复于 2003-09-04 16:22:19 得分 0

呵呵,该说的   firetoucher(风焱)   老大都说了。Top

8 楼jiaxianglei(傻猫)回复于 2003-09-04 16:30:21 得分 0

我的出生日期,性别,姓名都是同一表中的字段Top

9 楼wdsimon(我是谁?)回复于 2003-09-04 17:01:40 得分 10

建立测试表,加入测试数据:  
  create   table   table1(   姓名   char(15),性别   CHAR(2),出生日期   datetime)  
  insert   into   table1   values('张三','男','1988-08-10')  
  insert   into   table1   values('李四','男','1985-08-10')  
  insert   into   table1   values('王五','男','1985-08-10')  
  insert   into   table1   values('李丽','女','1980-08-10')  
  insert   into   table1   values('张勇','男','1980-08-10')  
  insert   into   table1   values('赵燕','女','1982-08-10')  
  insert   into   table1   values('白雪','女','1983-08-09')  
  insert   into   table1   values('钱六','男','1981-08-12')  
  SQL语句如下:  
  select   datediff(year,出生日期,getdate())   as   年龄,  
                count(case   when   性别='男'   then   姓名   end)   as   男工,  
                count(case   when   性别='女'   then   姓名   end)   as   女工  
                from   table1  
                group   by   datediff(year,出生日期,getdate())  
                where   datediff(year,出生日期,getdate())<45  
  是小于45岁吧????  
  结果集如下:  
  年龄       男工               女工  
  15 1 0  
  18 2 0  
  20 0 1  
  21 0 1  
  22 1 0  
  23 1 1  
  Top

10 楼jiaxianglei(傻猫)回复于 2003-09-04 17:07:45 得分 0

firetoucher(风焱)    
  这么复杂呀,我就一个表呀。Top

11 楼jiaxianglei(傻猫)回复于 2003-09-04 17:27:33 得分 0

wdsimon(老王)  
  where   datediff(year,出生日期,getdate())<45  
  这句有语法错误,我是用adoquery调用的。  
   
  Top

12 楼jiaxianglei(傻猫)回复于 2003-09-04 17:38:12 得分 0

你们所说的年龄好象是按年算的,能不能精确到月日?Top

13 楼wdsimon(我是谁?)回复于 2003-09-04 19:26:01 得分 10

呵呵,WHERE子句应该在前面:  
  select   datediff(year,出生日期,getdate())   as   年龄,  
                count(case   when   性别='男'   then   姓名   end)   as   男工,  
                count(case   when   性别='女'   then   姓名   end)   as   女工  
                from   table1  
                where   datediff(year,出生日期,getdate())<45  
                group   by   datediff(year,出生日期,getdate())Top

14 楼wdsimon(我是谁?)回复于 2003-09-04 19:28:08 得分 10

可以按月日啊,查一下SQL帮助,看看datediff的用法吧:  
  DATEDIFF  
  Returns   the   number   of   date   and   time   boundaries   crossed   between   two   specified   dates.    
   
  Syntax  
  DATEDIFF   (   datepart   ,   startdate   ,   enddate   )    
   
  Arguments  
  datepart  
   
  Is   the   parameter   that   specifies   on   which   part   of   the   date   to   calculate   the   difference.   The   table   lists   dateparts   and   abbreviations   recognized   by   Microsoft&reg;   SQL   Server&#8482;.  
   
  Datepart   Abbreviations    
  Year   yy,   yyyy    
  quarter   qq,   q    
  Month   mm,   m    
  dayofyear   dy,   y    
  Day   dd,   d    
  Week   wk,   ww    
  Hour   hh    
  minute   mi,   n    
  second   ss,   s    
  millisecond   ms    
   
  Top

15 楼jiaxianglei(傻猫)回复于 2003-09-04 19:44:18 得分 0

表格比较复杂:  
                            第一分厂               第二分厂........  
                    男工           女工       男工           女工........  
  16周岁  
  17周岁  
  .  
  .  
  .  
  大于45  
   
  有好几个分厂呀。  
  Top

16 楼pengdali()回复于 2003-09-04 19:58:28 得分 10

select   datediff(year,出生日期,getdate())   年龄,  
                sum(case   when   分厂='一分厂'   and   性别='男'   then   1   else   0   end)   一分厂男工,  
                sum(case   when   分厂='一分厂'   and   性别='女'   then   1   else   0   end)   一分厂女工,  
                sum(case   when   分厂='二分厂'   and   性别='男'   then   1   else   0   end)   二分厂男工,  
                sum(case   when   分厂='二分厂'   and   性别='女'   then   1   else   0   end)   二分厂女工  
                from   table1  
                where   datediff(year,出生日期,getdate())<45  
                group   by   datediff(year,出生日期,getdate())Top

17 楼prgliker(与美女无缘)回复于 2003-09-04 20:13:18 得分 10

我认为老王的SQL学的比较精,不过我还有一个提意就是能不有性别来分组呢(因为我学的是标准SQL对(CAS。。end)没感觉。这是不是SQLSEREVER中的扩展指令呀。Top

18 楼jiaxianglei(傻猫)回复于 2003-09-04 20:14:07 得分 0

wdsimon(老王)  
  我用你的方法试了,在Sql   server中查询时正常,但是当我在Delphi里运行时结果总是为0。  
  我的代码:  
      adoquery1.Close;  
      adoquery1.SQL.Clear;  
      adoquery1.SQL.Add('SELECT   datediff(year,   birthday,   getdate())   AS   年龄,');  
      adoquery1.SQL.Add('COUNT(CASE   WHEN   sex=:a   THEN   name   END)   AS   男工,');  
      adoquery1.SQL.Add('COUNT(CASE   WHEN   sex   =:b   THEN   name   END)   AS   女工');  
      adoquery1.SQL.Add('   FROM   pcjtworkersdata   WHERE   factory   =:c');  
      adoquery1.SQL.Add('   and   datediff(year,   birthday,   getdate())=22');  
      adoquery1.SQL.Add('   GROUP   BY   datediff(year,   birthday,   getdate())');  
      adoquery1.SQL.Add('   ORDER   BY   年龄   ');  
      adoquery1.Parameters.ParamByName('a').Value:='男';  
      adoquery1.Parameters.ParamByName('b').Value:='女';  
      adoquery1.Parameters.ParamByName('c').Value:='集团';  
      adoquery1.Open;  
      //birthday为出生日期,sex为性别  
      //工厂factory为集团,年龄为22岁的  
  edit1.Text:=inttostr(   adoquery1.fieldbyname('男工').Asinteger);  
  结果应该为18,但是却为0,不知为什么?Top

19 楼firetoucher(风焱)回复于 2003-09-04 20:36:57 得分 0

adoquery1.Parameters.ParamByName('a').Value:='''男''';  
  Top

20 楼firetoucher(风焱)回复于 2003-09-04 20:38:40 得分 0

我市为了让你看的明白点,ft,结果你说复杂了:(  
   
  用大力的吧Top

21 楼hmily1688(没什么好说的)回复于 2003-09-05 03:03:35 得分 10

MVP大力也五个星了,真是好看,厉害,学习中Top

22 楼jiaxianglei(傻猫)回复于 2003-09-06 09:14:39 得分 0

select   sum(case   when   性别='男'   then   1   else   0   end)   as   男工,  
                sum(case   when   性别='女'   then   1   else   0   end)   as   女工  
                from   table1  
   
  我用大力的方法统计的结果计算出来的男工和女工的和与上述select语句有出入,结果不一样,差了几十个呢,为什么呀?  
  Top

相关问题

  • 怎样统计员工的各年龄段的人数?
  • 使用graph数据窗口统计年龄段人数的问题
  • 求MSSQL语句:根据出生日期统计不同年龄段人数。
  • 如何按年龄段统计记录数?
  • 按出生日期计算年龄段,进行统计?
  • 请问大家如何统计各个年龄段的订单的预定次数,成功次数等
  • 进行年龄段统计,表中只有出生日期这个字段可用来统计,但他为字符型
  • 进行年龄段统计,表中只有出生日期这个字段可用来统计,但他为字符型
  • SQL统计人数问题
  • SQL统计人数问题

关键词

  • 字段
  • 数据
  • 出生日期
  • datediff
  • 年龄
  • 男工
  • getdate
  • 女工
  • 统计
  • 性别

得分解答快速导航

  • 帖主:jiaxianglei
  • firetoucher
  • sensory
  • firetoucher
  • samcrm
  • wdsimon
  • wdsimon
  • wdsimon
  • pengdali
  • prgliker
  • hmily1688

相关链接

  • Delphi类图书
  • Delphi类源码下载
  • Delphi控件下载

广告也精彩

反馈

请通过下述方式给我们反馈
反馈
网站简介|广告服务|VIP资费标准|银行汇款帐号|网站地图|帮助|联系方式|诚聘英才|English|问题报告
世纪乐知(北京)网络技术有限公司 版权所有, 京 ICP 证 020026 号
北京创新乐知广告有限公司 提供技术支持
Copyright © 2000-2007, CSDN.NET, All Rights Reserved
GongshangLogo