SQL 统计语句



http://www.jbxue.com/db/2292.html


--> 测试数据:[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)/10when 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 ENDAS '16-20'
SUM(CASE WHEN datediff(year[出生年月]getdate()) BETWEEN 21 AND 30 THEN 1 ELSE 0 ENDAS '21-30'
SUM(CASE WHEN datediff(year[出生年月]getdate()) BETWEEN 31 AND 40 THEN 1 ELSE 0 ENDAS '31-40'
SUM(CASE WHEN datediff(year[出生年月]getdate()) BETWEEN 41 AND 50 THEN 1 ELSE 0 ENDAS '41-50',
SUM(CASE WHEN datediff(year[出生年月]getdate()) BETWEEN 51 AND 60 THEN 1 ELSE 0 ENDAS '51-60'
SUM(CASE WHEN datediff(year[出生年月]getdate()) BETWEEN 61 AND 70 THEN 1 ELSE 0 ENDAS '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 字段名 < 4000then  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  表名    

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值