当前位置:  数据库>sqlserver

经典sql代码--按年龄段、品牌分类进行分组统计

    来源: 互联网  发布时间:2014-08-29

    本文导语:  经典sql代码--按年龄段、品牌分类进行分组统计,正在学习分组统计SQL的朋友有福了。 --> 测试数据:[tb] if object_id('[tb]') is not null drop table [tb] go create table [tb]([姓名] varchar(1),[部门] varchar(4),[学历] varchar(4),[出生年月] datetime) ...

经典sql代码--按年龄段、品牌分类进行分组统计,正在学习分组统计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 行受影响)
*/
 
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 and 字段名=8000  then 1 else 0 end) 别名 ,
count(*) as total
from  表名

原文链接:http://www.cnblogs.com/zengxiangzhan/archive/2010/02/04/1663468.html


    
 
 

您可能感兴趣的文章:

 
本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐
  • j2ee架构最经典的例子是什么?petstore算是最经典的例子吗?
  • 请大家推荐几个经典的JAVA网站!!(经典者给分)
  • THING IN JAVA 第二版(中文版) 已经出炉了!!(经典的不能再经典了)
  • 请你推荐一本给初学者的jsp经典好书!!! iis7站长之家
  • linux有没有像--《windows程序设计》一样经典的书籍
  • 在Linux下开发有哪些经典的书籍值得看
  • 大家帮推荐本 linux下多线程编程 的经典书吧 多谢
  • 求unix经典书籍
  • 求LINUX经典书籍
  • 谁知道经典的DOS游戏去哪里下载?
  • Wii经典街机iPhone移植版 SpaceBubble
  • java中最经典的书是什么
  • 大家能否推荐几个学习java的经典例子?
  • 请前辈介绍一本jsp+数据库的经典好书!!!
  • 请你推荐一本给初学者的jsp经典好书!!!
  • 请问哪一本LINUX源代码分析的书比较经典?
  • 我想系统的学习LINUX,有一订的计算机基础。可以推荐一本经典教材吗?
  • 请教学习c++有那些经典书籍?
  • 请各位大侠推荐两本Solaris的经典书籍?
  • <自己写操作系统>这本书电子版那位有啊?据说很经典的


  • 站内导航:


    特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,,E-mail:www_#163.com(请将#改为@)

    浙ICP备11055608号-3