相关数据表:

人口表
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
SET ANSI_PADDING ON
GO
CREATE TABLE [dbo].[T_People](
    
[id] [int] IDENTITY(1,1NOT NULL,
    
[sex] [varchar](50) COLLATE Chinese_PRC_CI_AS NOT NULL,
    
[birthday] [datetime] NOT NULL,
 
CONSTRAINT [PK_T_People] PRIMARY KEY CLUSTERED 
(
    
[id] ASC
)
WITH (IGNORE_DUP_KEY = OFFON [PRIMARY]
ON [PRIMARY]

GO
SET ANSI_PADDING OFF


要求统计如下:

年龄结构


年龄\性别

总计

1-10岁

3

8

11

11-20岁

2

2

4

21-30岁

5

5

10

31-40岁

2

4

6

41-50岁

2

1

3

51-60岁

3

1

4

71-80岁

10

6

16

81-90岁

1

1

2

91-100岁

3

5

8



 select age_range as 年龄段 ,sum(countas 总数,
 (
   
select count from  
   (
     
select  sex,age_range,count(*as count from 
     (
       
select sex,(((cast(getdate() as int)-cast(birthday as int))/365-1)/10as age_range 
       
from T_People 
     ) tb_1 
     
where age_range>=0   group by age_range,sex
   ) tb_2 
   
where sex='' and age_range=tb_3.age_range 
 ) 
as 男,
 (
       
select count from  
      (
        
select  sex,age_range,count(*as count from 
        (
          
select sex,(((cast(getdate() as int)-cast(birthday as int))/365-1)/10as age_range 
          
from T_People 
        ) tb_1 
        
where age_range>=0   group by age_range,sex
      ) tb_2 
      
where sex='' and age_range=tb_3.age_range 
  ) 
as 女 
  
from 
  (
    
select  sex,age_range,count(*as count from 
    (
      
select sex,(((cast(getdate() as int)-cast(birthday as int))/365-1)/10as age_range 
      
from T_People  
    ) tb_1 
    
where age_range>=0   group by age_range,sex
  ) tb_3 
  
group by age_range order by age_range

查询结果:

年龄段中0即对于1-10岁,依此类推。9以后的都是100岁以上的。

如果还有别的实现方法,还请指出!