具有不同计数的SQLGroup

具有不同计数的SQLGroup,sql,sql-server,Sql,Sql Server,我有疑问 select count(distinct(a.studentid)count, case when a.Age <=19 then '1-19' when a.Age between 20 and 29 then '20-29' end as age_range from table a where 0 = 0 group by a.age 不确定为什么不按范围分组并期望结果。多谢各位 count age_range 15

我有疑问

select count(distinct(a.studentid)count,
    case
      when a.Age <=19 then '1-19'
      when a.Age between 20 and 29 then '20-29'
    end as age_range
from table a 
where 0 = 0
group by a.age
不确定为什么不按范围分组并期望结果。多谢各位

 count   age_range
 15       1-19
 30       20-29

我建议
交叉应用
来定义别名:

select v.age_range, count(distinct a.studentid)count,
from table a cross apply
     (values (case when a.Age <= 19 then 'Under 12 months-19'
                   when a.Age between 20 and 29 then '20-29'
              end)
     ) as v(age_range)
group by v.age_range;

我建议
交叉应用
来定义别名:

select v.age_range, count(distinct a.studentid)count,
from table a cross apply
     (values (case when a.Age <= 19 then 'Under 12 months-19'
                   when a.Age between 20 and 29 then '20-29'
              end)
     ) as v(age_range)
group by v.age_range;

根据您的案例陈述分组:

select count(distinct(a.studentid)count,
    case
      when a.Age <=19 then 'Under 12 months-19'
      when a.Age between 20 and 29 then '20-29'
    end as age_range
from table a 
where 0 = 0
group by case
      when a.Age <=19 then 'Under 12 months-19'
      when a.Age between 20 and 29 then '20-29'
    end
选择计数(独立(a.studentid)计数,
案例

当a.年龄组根据您的病例陈述进行分组时:

select count(distinct(a.studentid)count,
    case
      when a.Age <=19 then 'Under 12 months-19'
      when a.Age between 20 and 29 then '20-29'
    end as age_range
from table a 
where 0 = 0
group by case
      when a.Age <=19 then 'Under 12 months-19'
      when a.Age between 20 and 29 then '20-29'
    end
选择计数(独立(a.studentid)计数,
案例

当a.Age时,我更喜欢将层保存在通用层表中,从而从代码中删除逻辑,并允许您为多个主服务器提供服务

示例

Declare @Tier table (Tier_Grp varchar(50),Tier_R1 money,Tier_R2 money,Tier_Title varchar(50))
Insert Into @Tier values
 ('Age Range',1 , 20,' 1-19')
,('Age Range',21, 29,'21-29')
,('Age Range',31, 39,'31-39')
,('Age Range',40,999,'Over 40')
,('Age Range',1 ,999,'Total')


Select A.Tier_R1
      ,A.Tier_R2
      ,A.Tier_Title
      ,Cnt   =  count(Distinct studentid)
 From @Tier A
 Left Join  YourTable B 
        on A.Tier_Grp='Age Range'
           and B.Age>=A.Tier_R1 
           and B.Age<A.Tier_R2
 Group By A.Tier_R1
         ,A.Tier_R2
         ,A.Tier_R2
 Order By Tier_R1,Tier_R2
Declare@Tier表(Tier_Grp varchar(50)、Tier_R1 money、Tier_R2 money、Tier_Title varchar(50))
插入到@Tier值中
(‘年龄范围’、1、20、‘1-19’)
,(‘年龄范围’、21、29、‘21-29’)
,(‘年龄范围’、31、39、‘31-39’)
,(“年龄范围”,“40999”,“40岁以上”)
,(“年龄范围”,1999年,“总数”)
选择A.Tier\u R1
,A.Tier_R2
,A.Tier_标题
,Cnt=计数(不同的studentid)
来自@Tier A
左键连接表B
在A.Tier_Grp='Age Range'
和B.Age>=A.Tier_R1

B.Age我更喜欢将层保存在通用层表中,从而从代码中删除逻辑,并允许您为多个主服务器提供服务

示例

Declare @Tier table (Tier_Grp varchar(50),Tier_R1 money,Tier_R2 money,Tier_Title varchar(50))
Insert Into @Tier values
 ('Age Range',1 , 20,' 1-19')
,('Age Range',21, 29,'21-29')
,('Age Range',31, 39,'31-39')
,('Age Range',40,999,'Over 40')
,('Age Range',1 ,999,'Total')


Select A.Tier_R1
      ,A.Tier_R2
      ,A.Tier_Title
      ,Cnt   =  count(Distinct studentid)
 From @Tier A
 Left Join  YourTable B 
        on A.Tier_Grp='Age Range'
           and B.Age>=A.Tier_R1 
           and B.Age<A.Tier_R2
 Group By A.Tier_R1
         ,A.Tier_R2
         ,A.Tier_R2
 Order By Tier_R1,Tier_R2
Declare@Tier表(Tier_Grp varchar(50)、Tier_R1 money、Tier_R2 money、Tier_Title varchar(50))
插入到@Tier值中
(‘年龄范围’、1、20、‘1-19’)
,(‘年龄范围’、21、29、‘21-29’)
,(‘年龄范围’、31、39、‘31-39’)
,(“年龄范围”,“40999”,“40岁以上”)
,(“年龄范围”,1999年,“总数”)
选择A.Tier\u R1
,A.Tier_R2
,A.Tier_标题
,Cnt=计数(不同的studentid)
来自@Tier A
左键连接表B
在A.Tier_Grp='Age Range'
和B.Age>=A.Tier_R1

和B.age意外结果的原因是分组后应用了
case
表达式。显然,该数据中有四个不同的年龄,因此有四个输出行。意外结果的原因是分组后应用了
case
表达式。显然,该数据中有四个不同的年龄a因此有四个输出行。