博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
SQL 年龄段 品牌分类 分组统计
阅读量:6476 次
发布时间:2019-06-23

本文共 4738 字,大约阅读时间需要 15 分钟。

--
> 测试数据:[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 total

from  表名    

    本文转自曾祥展博客园博客,原文链接:http://www.cnblogs.com/zengxiangzhan/archive/2010/02/04/1663468.html,如需转载请自行联系原作者

你可能感兴趣的文章
论程序员加班的害处
查看>>
基于HTML5的WebGL设计汉诺塔3D游戏
查看>>
WPF资料链接
查看>>
再次更新
查看>>
利用Windows自带的Certutil查看文件MD5
查看>>
查询指定名称的文件
查看>>
开篇,博客的申请理由
查看>>
[JSOI2008]星球大战starwar BZOJ1015
查看>>
centos 7 部署LDAP服务
查看>>
iOS项目分层
查看>>
IntelliJ IDEA 注册码
查看>>
String字符串的截取
查看>>
DynamoDB Local for Desktop Development
查看>>
Shell编程-环境变量配置文件
查看>>
Struts2和Spring MVC的区别
查看>>
理解Javascript参数中的arguments对象
查看>>
<<The C Programming Language>>讀書筆記
查看>>
git代码冲突
查看>>
解析查询 queryString 请求参数的函数
查看>>
git bash 风格调整
查看>>