相关文章推荐
考研的海豚  ·  使用 Exchange 中的 EWS ...·  8 月前    · 
销魂的香菜  ·  Power ...·  1 年前    · 
挂过科的酱肘子  ·  python - only integer ...·  1 年前    · 

在工作中遇到了这样的一个问题,就是需要将查询出来的数据进行分类汇总。这里用到了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——依次按照住址,部门,性别三个条件进行分类汇总
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、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

在工作中遇到了这样的一个问题,就是需要将查询出来的数据进行分类汇总。这里用到了with rollup。下面是效果图。为了得到这样的效果,我们该如何做呢,我们来做这个小demo。数据库字样需求分析本实例为demo,没有任何意义。仅仅是为了完成功能。 1、依次按照住址,部门,性别三个条件进行汇总,汇总出他们的月薪总金额,和纳税总金额。代码实现1——依次按照住址,部门,性别三个...
客户提出需求,针对某一列分组加上小计合计汇总。网上找了一些有关SQL合计的语句。都不是很理想。决定自己动手写。思路有三个:1.很多用GROUPPING和ROLLUP实现。  优点:实现代码简洁,要求对GROUPPING和ROLLUP很深的理解。  缺点:低版本的Sql Server不支持。2.游标实现。  优点:思路逻辑简洁。  缺点:复杂和低效。3.利用临时表。  优点:思路逻辑简洁,执行效率高。SQL实现简单。  缺点:数据量大时耗用内存. 综合三种情况,决定“利用临时表”实现实现效果原始表TB 加上小计合计后效果 SQL语句 代码如下:select * into #TB f
SELECT CASE WHEN GROUPING(GradeName)=1 THEN '合计' ELSE GradeName END AS 年级 , SUM(CASE WHEN Sex=1 THEN 1 ELSE 0 END) AS 男生数, SUM(CASE WHEN Sex=0 THEN...
CUBE:CUBE 生成的结果集显示了所选列中值的所有组合的聚合。 ROLLUPROLLUP生成的结果集显示了所选列中值的某一层次结构的聚合。 GROUPING:当行由 CUBE 或 ROLLUP 运算符添加时,该函数将导致附加列的输出值为 1;当行不由 CUBE 或 ROLLUP 运算符添加时,该函数将导致附加列的输出值为 0。 先创建一个临时表: 1 create table...
SQL Server 中,要对某一列进行分组并计算小计总计,可以使用 GROUP BY 和 SUM() 函数。 例如,对于一个名为 "orders" 的表,其中有 "product" 和 "price" 两列,要按照 "product" 列进行分组并计算每组的小计总计,可以使用如下 SQL 语句: SELECT product, SUM(price) as subtotal FROM or...
/* –1 UNION 运算符是将两个或更多查询的结果组合为单个结果集 使用 UNION 组合查询的结果集有两个最基本的规则: 1。所有查询中的列数和列的顺序必须相同。 2。数据类型必须兼容 a.UNION的结果集列名与第一个select语句中的结果集中的列名相同,其他select语句的结果集列名被忽略 b.默认情况下,UNION 运算符是从结果集中删除重复行。如果使用all关键字,那么结果集将包含所有行并且不删除重复行 c.sql是从左到右对包含UNION 运算符的语句进行取值,使用括号可以改变求值顺序 –例如: */ select * from tablea union all ( sel