您的位置:首页 > 数据库

SQL 年龄段 品牌分类 分组统计

2010-02-04 11:00 295 查看
--> 测试数据:[tb]

if object_id('[tb]') is not null drop table [tb]

go

create table [tb]([姓名] varchar(1),[部门] varchar(4),[学历] varchar(4),[出生年月] datetime)

insert [tb]

select 'A','后勤','高中','1986-1-1' union all

select 'B','后勤','初中','1984-3-7' union all

select 'C','管理','本科','1987-2-1' union all

select 'D','操作','专科','1976-2-1' union all

select 'E','操作','专科','1943-2-1'

--------------开始查询--------------------------

declare @sql varchar(8000)

set @sql = 'select 部门,dbo.AgeLevel([出生年月]) as 年龄段'

select @sql = @sql + ' , sum(case 学历 when ''' + 学历 + ''' then 1 else 0 end) [' + 学历 + ']'

from (select distinct 学历 from tb) as a

set @sql = @sql + ' from tb group by 部门,dbo.AgeLevel([出生年月])'

exec(@sql)

/*

部门 年龄段 本科 初中 高中 专科

---- ---------- ----------- ----------- ----------- -----------

管理 21-30 1 0 0 0

后勤 21-30 0 1 1 0

操作 31-40 0 0 0 1

操作 50以上 0 0 0 1

(4 行受影响)

*/

drop function AgeLevel

go

--获取年龄段

create function AgeLevel(@birthday datetime)

returns varchar(10)

as

begin

declare @AgeLevel varchar(10)

select @AgeLevel=case((datediff(year,@birthday,getdate())-1)/10) when 2 then '21-30' when 3 then '31-40' when 4 then'41-50' else '50以上' end

return @AgeLevel

end

go

select * ,dbo.AgeLevel([出生年月]) as 年龄段 from tb

/*

姓名 部门 学历 出生年月 年龄段

---- ---- ---- ----------------------- ----------

A 后勤 高中 1986-01-01 00:00:00.000 21-30

B 后勤 初中 1984-03-07 00:00:00.000 21-30

C 管理 本科 1987-02-01 00:00:00.000 21-30

D 操作 专科 1976-02-01 00:00:00.000 31-40

E 操作 专科 1943-02-01 00:00:00.000 50以上

*/

select N'年龄段'=(

case((datediff(year,[出生年月],getdate())-1)/10)

when 2 then '21-30'

when 3 then '31-40'

when 4 then'41-50'

else '50以上'

end),

count(*) as count

from tb

group by (

case((datediff(year,[出生年月],getdate())-1)/10)

when 2 then '21-30'

when 3 then '31-40'

when 4 then'41-50'

else '50以上'

end )

/*

年龄段 count

------ -----------

21-30 3

31-40 1

50以上 1

(3 行受影响)

*/

--以10岁为递增

select

cast(f1*10+1 as varchar(3))+'-'+cast(f1*10+10 as varchar(3)) as 年龄段,f2 as 人数

from

(

select datediff(d,[出生年月],getdate())/365/10 as f1,

count(*) as f2

from tb

group by datediff(d,[出生年月],getdate())/365/10) a

order by cast(f1*10+1 as varchar(3))+'-'+cast(f1*10+10 as varchar(3))

/*

年龄段 人数

------- -----------

21-30 3

31-40 1

61-70 1

(3 行受影响)

*/

SELECT

SUM(

CASE WHEN datediff(year, [出生年月], getdate()) BETWEEN 16 AND 20 THEN 1 ELSE 0 END) AS '16-20',

SUM(CASE WHEN datediff(year, [出生年月], getdate()) BETWEEN 21 AND 30 THEN 1 ELSE 0 END) AS '21-30',

SUM(CASE WHEN datediff(year, [出生年月], getdate()) BETWEEN 31 AND 40 THEN 1 ELSE 0 END) AS '31-40',

SUM(CASE WHEN datediff(year, [出生年月], getdate()) BETWEEN 41 AND 50 THEN 1 ELSE 0 END) AS '41-50',

SUM(CASE WHEN datediff(year, [出生年月], getdate()) BETWEEN 51 AND 60 THEN 1 ELSE 0 END) AS '51-60',

SUM(CASE WHEN datediff(year, [出生年月], getdate()) BETWEEN 61 AND 70 THEN 1 ELSE 0 END) AS '61-70'

FROM tb

/*

16-20 21-30 31-40 41-50 51-60 61-70

----------- ----------- ----------- ----------- ----------- -----------

0 3 1 0 0 1

(1 行受影响)

*/

create table brands(id int,brand varchar(10), address varchar(10))

insert into brands values(1 ,'联想', '北京')

insert into brands values(2 ,'惠普', '美国')

insert into brands values(3 ,'神舟', '深圳')

create table products(id int, brand int, name varchar(10))

insert into products values(1 ,1, '联想1')

insert into products values(2 ,1, '联想2')

insert into products values(3 ,2, '惠普1')

insert into products values(4 ,2, '惠普2'
) insertinto products values(5 ,1, '联想3')

insertinto products values(6 ,3, '神舟1')

insertinto products values(7 ,1, '联想4')

go

select ID=row_number()over(order by getdate()),

b.产品数量,

a.[brand],

a.[address]

from brands a,

(select [brand],

count([brand])产品数量

from products

group by [brand] )b

where a.[ID]=b.[brand]

order by b.产品数量 desc

select b.id,b1.cnt as 产品数量,b.brand,b.address

from brands b

join

(

select brand,count(brand) cnt

from products

group by brand

) b1

on b1.brand=b.id

id 产品数量 brand address

----------- ----------- ------------------------------ ------------------------------

1 4 联想 北京

2 2 惠普 美国

3 1 神舟 深圳

(3 行受影响)

select sum(case when ( 字段名>0 and 字段名<4000) then 1 else 0 end) 别名,
sum(case when 字段名>=4000 and 字段名<8000 then 1 else 0 end) 别名,
sum(case when 字段名>=8000 then 1 else 0 end) 别名 ,
count(*) as totalfrom 表名
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: