SQL 年龄段 品牌分类 分组统计
--> 测试数据:[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 行受影响)
*/
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 行受影响)
from 表名
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'
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
sum(case when 字段名>=4000 and 字段名<8000 then 1 else 0 end) 别名,
sum(case when 字段名>=8000 then 1 else 0 end) 别名 ,
count(*) as total
分类:
SQL Server
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Java 中堆内存和栈内存上的数据分布和特点
· 开发中对象命名的一点思考
· .NET Core内存结构体系(Windows环境)底层原理浅谈
· C# 深度学习:对抗生成网络(GAN)训练头像生成模型
· .NET 适配 HarmonyOS 进展
· 用 DeepSeek 给对象做个网站,她一定感动坏了
· DeepSeek+PageAssist实现本地大模型联网
· 手把手教你更优雅的享受 DeepSeek
· 腾讯元宝接入 DeepSeek R1 模型,支持深度思考 + 联网搜索,好用不卡机!
· 从 14 秒到 1 秒:MySQL DDL 性能优化实战