zoukankan      html  css  js  c++  java
  • SQLSERVER 使用 ROLLUP 汇总数据,实现分组统计,总计(合计),小计

    版权声明:本文为博主原创文章,未经博主允许不得转载。本人观点或有不当之处,请在评论中及时指正,我会在第一时间内修改。 https://blog.csdn.net/aiming66/article/details/80717802

    在工作中遇到了这样的一个问题,就是需要将查询出来的数据进行分类汇总。这里用到了with rollup。下面是效果图。
    这里写图片描述

    为了得到这样的效果,我们该如何做呢,我们来做这个小demo。
    数据库字样

    这里写图片描述
    需求分析

    本实例为demo,没有任何意义。仅仅是为了完成功能。
    1、依次按照住址,部门,性别三个条件进行汇总,汇总出他们的月薪总金额,和纳税总金额。
    代码实现1——依次按照住址,部门,性别三个条件显示他们的每人详细信息

    select
        emp.address as 住址,
        emp.dep as 部门,
        case when emp.sex='1' then '男'else '女' end as 性别,
        emp.name as 姓名,
        emp.monthly_pay as 税前月薪,
        emp.monthly_pay *emp.rate_duty as 纳税金额,
        emp.monthly_pay *(1-emp.rate_duty) as 实际月薪金额
    from Employees emp
    order by
        emp.address ,
        emp.dep ,
        emp.sex

        1
        2
        3
        4
        5
        6
        7
        8
        9
        10
        11
        12
        13

    效果如下:
    这里写图片描述
    代码实现1——依次按照住址,部门,性别三个条件进行分类汇总

    select

                CASE WHEN grouping(emp.address) = '1' THEN '总计'
                    WHEN grouping(emp.address) = '0' AND grouping(emp.dep) = '1' THEN emp.address + '小计'
                    ELSE emp.address
                END 住址,
            --------------------------------------  
                CASE WHEN grouping(emp.dep) = '1' THEN ''
                    WHEN grouping(emp.dep) = '0' AND grouping(emp.sex) = '1' THEN emp.dep + '小计'
                    ELSE emp.dep
                END 部门,     
            ------------------------------------------------------------------
                case when emp.sex='1' then '男' when emp.sex='0' then '女' end as 性别,

                sum(cast(emp.monthly_pay as int)) as 税前月薪,
                sum(emp.monthly_pay *emp.rate_duty) as 纳税金额,
                sum(emp.monthly_pay *(1-emp.rate_duty) )as 实际月薪金额

                from Employees emp
                group by
                    emp.address,
                    emp.dep,
                    emp.sex
                    with rollup
                order by
                    emp.address desc,
                    emp.dep desc,
                    emp.sex desc

        1
        2
        3
        4
        5
        6
        7
        8
        9
        10
        11
        12
        13
        14
        15
        16
        17
        18
        19
        20
        21
        22
        23
        24
        25
        26
        27
        28
        29
        30

    效果图:
    这里写图片描述

    总结:
    1、with rollup 要和case when 一起搭配使用。
    2、因为使用with rollup 要用到group by 进行分组,所以这样的汇总必须结合聚合函数,比如,sum ,max等等。常用的聚合函数参考菜鸟教程:http://www.runoob.com/sqlite/sqlite-functions.html
    3、对于汇总,强烈建议,使用“小计”,“总计”这样的字,坚决不建议使用“合计”。因为从代码中我们可以看出来,我们使用了order by ,order by 是以汉字拼音排序的,有的是时候就容易出不来效果,尤其是,我们汇总完了再进行分页的时候。(小编因为这个问题,曾经郁闷了一个下午)

    demo 数据库和sql脚本下载地址:
    https://download.csdn.net/download/aiming66/10483246
    ---------------------
    作者:aiming66
    来源:CSDN
    原文:https://blog.csdn.net/aiming66/article/details/80717802
    版权声明:本文为博主原创文章,转载请附上博文链接!

  • 相关阅读:
    第六次上机作业
    NOIP2016 DAY1 T2天天爱跑步
    NOIP2009 T2 Hankson的趣味题
    NOIP2013 DAY2 T3火车运输
    线段树
    NOIP2012 DAY2 T2借教室
    NOIP2015 DAY2 T1跳石头
    NOIP2016 DAY2 T3 愤怒的小鸟
    文本编辑常用快捷键
    洛谷P1516 青蛙的约会
  • 原文地址:https://www.cnblogs.com/dragon2017/p/10120519.html
Copyright © 2011-2022 走看看