• 分段统计查询的方法


    分段统计的方式主要有两种,一种如下要求:
    有两个表:
    1.成绩分段表(ID为自增列)
    ID  MaxFen  MinFen
    ——————–
    1   510     500
    2   500     490
    3   490     480

    2.总成绩表
    ClassID   StudentID  SumFen(总分)
    ————————————
    000005     000001      503
    000005     000003      498
    000004     000006      487
    000004     000003      501

    3.班级表
    ClassID   ClassName
    ———————–
    000004     104班
    000005     105班

    要求结果:
    ≥500     ≥490     ≥480
    —————————————-
    105班    1          1
    104班    1                     1

    总分分段值是随机的,最多30个分段
    即要求分段为横向显示:
    方法:
    – 示例数据
    Create TABLE 成绩分段表(
    ID int IDENTITY, MaxFen int, MinFen int)
    Insert 成绩分段表
    Select 510, 500 UNION ALL
    Select 500, 490 UNION ALL
    Select 490, 480

    Create TABLE 总成绩表(
    ClassID varchar(10), StudentID varchar(10), SumFen int)
    Insert 总成绩表
    Select ‘000005′, ‘000001′, 503 UNION ALL
    Select ‘000005′, ‘000003′, 498 UNION ALL
    Select ‘000004′, ‘000006′, 487 UNION ALL
    Select ‘000004′, ‘000003′, 501

    Create TABLE 班级表(
    ClassID varchar(10), ClassName varchar(10))
    Insert 班级表
    Select ‘000004′, ‘104班’ UNION ALL
    Select ‘000005′, ‘105班’
    GO

    – 查询
    DECLARE @s nvarchar(4000)
    SET @s = N”
    Select @s = @s + N’,’
    + QUOTENAME(‘≥’ + RTRIM(MinFen))
    + N’=SUM(CASE WHEN B.SumFen>=’ + RTRIM(MinFen)
    + N’ AND SumFen<’ + RTRIM(MaxFen)
    + N’ THEN 1 END)’
    FROM 成绩分段表
    orDER BY ID
    EXEC(N’
    Select C.ClassName’ + @s + N’
    FROM 班级表 C, 总成绩表 B
    Where C.ClassID = B.ClassID
    GROUP BY C.ClassName
    ‘)
    GO

    – 删除测试
    Drop TABLE 成绩分段表, 总成绩表, 班级表

    – 结果:

    ClassName≥500≥490≥480
    104班1NULL1
    105班11NULL

    第二种要求则要求纵向显示:
    有一组数据如下
    编号(id)   重量(weight)
    1            20
    2            15
    3             5
    4            60
    5            12
    6            33
    7            45
    8            59
    9            89
    10            110
    现在想在程序里动态的按区间统计。
    比如 在程序里选择10——50 之间间隔10的有多少个。
    希望的结果:
    10-20          4
    20-30          2
    30-40          1
    40-50          1

    这里区间10,50 和间隔10 ,都是可以动态设定的。
    declare @t table(id int,weight int)
    insert into @t select  1, 20
    insert into @t select  2, 15
    insert into @t select  3,  5
    insert into @t select  4, 60
    insert into @t select  5, 12
    insert into @t select  6, 33
    insert into @t select  7, 45
    insert into @t select  8, 59
    insert into @t select  9, 89
    insert into @t select 10,110

    declare @p int
    set @p=10
    select
    rtrim(p*@p)+’-'+rtrim((p+1)*@p) as p,
    num
    from
    (select (weight/@p) as p,count(*) as num from @t where weight between 10 and 50 group by (weight/@p)) a

    /*
    p                         num
    ————————- ———–
    10-20                     2
    20-30                     1
    30-40                     1
    40-50                     1
    */

  • 相关阅读:
    poj 4005 Moles
    牛客 2C 圈圈
    牛客 2B 树 (组合计数)
    AC日记——校门外的树(增强版) 洛谷 P1276
    AC日记——寻找道路 洛谷 P2296
    AC日记——挤牛奶 洛谷 P1204
    AC日记——最大数 洛谷 P1198 [JSOI2008]
    AC日记——中位数 洛谷 P1168
    AC日记——校门外的树 洛谷 P1047
    AC日记——约瑟夫问题 codevs 1282
  • 原文地址:https://www.cnblogs.com/Gaojier/p/2783614.html
Copyright © 2020-2023  润新知