zoukankan      html  css  js  c++  java
  • 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)/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  表名    

  • 相关阅读:
    hdu 1849 (尼姆博弈)
    Spring中Quartz的配置
    DevExpress后置代码中初始化SQL数据源的方法
    MySQL 存储过程例子,不能在if else里面用begin end否则会报错Error Code : 1064!
    javascript实现的可改变滚动方向的无缝滚动
    Android本地视频播放器开发--视频解码
    uva 10196 Check The Check
    Oracle PL/SQL 非预定义异常、自定义异常处理、RAISE_APPLICATION_ERROR
    Hibernate获取Connection
    SQL查询数据封装JavaBean对象
  • 原文地址:https://www.cnblogs.com/zengxiangzhan/p/1663468.html
Copyright © 2011-2022 走看看