版权声明:本文为博主原创文章,未经博主允许不得转载。本人观点或有不当之处,请在评论中及时指正,我会在第一时间内修改。 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
版权声明:本文为博主原创文章,转载请附上博文链接!

SQLSERVER 使用 ROLLUP 汇总数据,实现分组统计,总计(合计),小计的更多相关文章

  1. SQLSERVER 使用 ROLLUP 汇总数据,实现分组统计,合计,小计

    表结构: CREATE TABLE [dbo].[Students]( ,) NOT NULL, ) NULL, [Sex] [int] NOT NULL, ) NULL, ) NULL, , ) N ...

  2. 常用sql:按照表中的某一列对数据进行分组,统计数据条数

    select FROM_UNIXTIME(start_time,'%Y-%m-%d')as date,COUNT(*) FROM random_num GROUP BY FROM_UNIXTIME(s ...

  3. 【SQL】面面俱到 | 在SQL中使用CUBE和ROLLUP实现数据多维汇总

    偶然在网上看到一篇文章,讲到数据汇总,提到了CUBE,感觉有些晦涩,想试着自己表述一下.同时,个人也认为CUBE还是很有用的,对SQL或数据分析感兴趣的小伙伴不妨了解一下,或许有用呢! 先设定个需求, ...

  4. sql server 分组统计数据

    说明:group by是sql中对数据表中的数据进行分组的,在select列表中出现的字段必须全部出现在group by 字段中,出现在聚合函数中的字段在group by中可有可无,没有出现在sele ...

  5. C# Linq及Lamda表达式实战应用之 GroupBy 分组统计

    在项目中做统计图表的时候,需要对查询出来的列表数据进行分组统计,首先想到的是避免频繁去操作数据库可以使用 Linq eg: //例如对列表中的Cu元素进行按年GroupBy分组统计 //包含年份,平均 ...

  6. Mysql按日、周、月进行分组统计

    我们在用 Mysql 制作数据可视化图表时候,经常需要按照天.周.月等不同的粒度对数据进行分组统计.而我们的时间可能是 “2017/12/5 0:0:0” 这种准确的时间. 所以在进行分组之前我们需要 ...

  7. 用SQL实现统计报表中的"小计"与"合计"的方法详解

    本篇文章是对使用SQL实现统计报表中的"小计"与"合计"的方法进行了详细的分析介绍,需要的朋友参考下   客户提出需求,针对某一列分组加上小计,合计汇总.网上找 ...

  8. ORACLE的分组统计之ROLLUP(一)

    Oracle 9i以后,扩展了group by 的功能,能够满足大部分多维数据的分析统计功能,主要表现: 1. rollup,cube,grouping sets 扩展group by字句提供了丰富的 ...

  9. R语言︱数据分组统计函数族——apply族用法与心得

    每每以为攀得众山小,可.每每又切实来到起点,大牛们,缓缓脚步来俺笔记葩分享一下吧,please~ --------------------------- 笔者寄语:apply族功能强大,实用,可以代替 ...

随机推荐

  1. js 判断 复选框全选、全不选、反选、必选一个

    一个挺 使用的 js 代码片段,  判断  复选框全选.全不选.反选.必选一个 记录下, 搬来的 思路: 修改数据的 选中与否状态, 拿到所有的输入框,看是否有选中的状态 <html> & ...

  2. 如何从只会 C++ 语法的水平到达完成项目编写软件的水平?

    原文:https://www.zhihu.com/question/29702729 学习 C++ 有一段时间了,但只是停留在熟悉语法阶段,在看 C++primer,不过感觉这本书比较深奥,不太适合, ...

  3. 修改maven默认的jdk版本

    修改maven默认的jdk版本,想改彻底需要在maven的全局配文件(settings.xml)增加以下信息:   在profiles 节点下增加: <profile> <id> ...

  4. Azure School 终于上线了,物联网开发课程先走一波~

    要说目前最热门的技术是什么,物联网(IoT)肯定荣登榜首!老牌科技企业早已涉足,新晋初创公司层出不穷,就连很多传统企业也开始试水这一领域…… 物联网,说小其实挺小,工业仪表.汽车飞机,甚至家用电器,专 ...

  5. C# winfrom界面跳转闪烁问题解决方法

    在窗体的构造函数中添加代码: SetStyle(ControlStyles.UserPaint, true); SetStyle(ControlStyles.AllPaintingInWmPaint, ...

  6. 沉淀,再出发:PHP的简单使用

    沉淀,再出发:PHP的简单使用 一.前言 关于PHP,笔者在本科的时候就听到了太多太多,可惜虽然看了很多的教材,听到了无数遍,也没有系统性的整理过和学习过这方面的知识,这点无论什么时候想起来都是一种遗 ...

  7. Buffers与cached啥区别

    A buffer is something that has yet to be “written” to disk. A cache is something that has been “read ...

  8. java构造方法-this关键字的用法

    public class constructor { public static void main(String[] args) { // TODO Auto-generated method st ...

  9. 解决python编码问题报错:'ascii' codec can't encode characters in position 0-15: ordinal not in range(128)

    这个问题很奇怪,在服务器上执行一个写数据库的python文件,正常执行,但是使用java的ssh进行调用脚本,发现就是不执行数据库的写入,然后使用了try except的方式,打印了错误信息,发现报错 ...

  10. Java基础知识强化之多线程笔记07:同步、异步、阻塞式、非阻塞式 的联系与区别

    1. 同步: 所谓同步,就是在发出一个功能调用时,在没有得到结果之前,该调用就不返回.但是一旦调用返回,就必须先得到返回值了. 换句话话说,调用者主动等待这个"调用"的结果. 对于 ...