8第八章CTE递归及分组汇总高级部分(多维数据集)(转载)

8第八章CTE递归及分组汇总高级部分(多维数据集)

这里贴图太麻烦。。。算了

UNION 等集合操作符:

UNION 等以第一个 SELECT  的 列明 作为 整个结果集的列明,整个结果集 唯一认可的 唯一逻辑处理阶段 是 ORDER BY

这个意思是说 只有 ORDER BY 是对整个结果集作用的,其它都操作都作用在 UINON 两侧的 子集合中。

EXCEPT 操作符也是 提出了重复值的

此外,它认为两个 null 值是相等的,

而 NOT EXISTS 认为两个 null 值不相等,

集合操作符的 优先级是 INTERSECT 最大,其它都一样

CTE 递归 是个 重点, 分为 单个 定位点成员,单个递归成员,多个定位点,多个递归成员

1. 单个 定位点成员,单个递归成员

//todo

2. 多个定位点,多个递归成员

// todo

特别注意 只有一个维度去观看的时候,WITH CUBE 或者 WITH ROLLUP 的结果是一样的。

而下面 例子中的 WITH CUBE 或者 WITH ROLLUP 语句都会被 GROUP BY 后面的 CUBE(col1,col2) 或者 ROLLUP(col1,col2) 所替代,因为这种更加符合 ISO 标准些

IF object_id(‘dbo.Inventory‘,‘U‘) IS NOT NULL

DROP TABLE dbo.Inventory

GO

CREATE TABLE Inventory(

Item varchar(5),

Color char(4),

Qty int

)

INSERT INTO dbo.Inventory

VALUES(‘桌子‘,‘蓝色‘,2),

(‘桌子‘,‘红色‘,1),

(‘桌子‘,‘蓝色‘,3),

(‘椅子‘,‘蓝色‘,4),

(‘椅子‘,‘红色‘,6),

(‘椅子‘,‘红色‘,5)

select Item,Color,SUM(Qty) AS Sum_Qty from dbo.Inventory GROUP BY Item,Color WITH CUBE  --  Group by Item,Color WITH CUBE 也可以替换为 Group by CUBE(Item,Color) 以下同理

select Item,Color,SUM(Qty) AS Sum_Qty from dbo.Inventory GROUP BY Item,Color with rollup

重点:

区分 空值与汇总值

使用 Grouping(Item) 或者 Grouping(Color) 函数 去区分

当 Grouping 函数返回 1 时候证明是汇总的,否则 就是真正的 null 值

1. Cube ------======---

select

CASE WHEN Grouping(Item) = 1

Then ‘汇总‘ ELSE ISNULL(Item,‘未知‘)

End as Item,

CASE WHEN Grouping(Color) = 1 Then ‘汇总‘ ELSE ISNULL(Color,‘未知‘) End as Item,

SUM(Qty) AS Sum_Qty

from dbo.Inventory GROUP BY Item,Color with cube

2. 对于 ROLLUP ------======

select

CASE WHEN Grouping(Item) = 1

Then ‘汇总‘ ELSE ISNULL(Item,‘未知‘)

End as Item,

CASE WHEN Grouping(Color) = 1 Then ‘汇总‘ ELSE ISNULL(Color,‘未知‘) End as Item,

SUM(Qty) AS Sum_Qty

from dbo.Inventory GROUP BY Item,Color with rollup

3.怎样返回指定维度的 汇总:

1。 使用派生表 然后 对派生表 做 where 条件筛选

即 把上面汇总的 select 查询语句做成一个 子查询数据集

然后从这个 数据集中 筛选 Item is not null and Color is null 诸如此类的。

2.   使用GROUPING SETS 指定仅需要获取所需的分组

不带 null, null 这种情况的:

带上 null , null 这种情况的

原文链接

本文由豆约翰博客备份专家远程一键发布

时间: 2024-10-08 00:04:46

8第八章CTE递归及分组汇总高级部分(多维数据集)(转载)的相关文章

集算器协助Java处理结构化文本之分组汇总

直接用Java实现文体文件分组汇总会有如下的麻烦: 1.文件不是数据库,不能用SQL访问.当分组.汇总表达式变化时,只能改写代码.而要实现灵活表达式的话,需要自己实现动态表达式解析和求值,编程工作量非常大. 2.遍历过程中记录分组结果,结果小了还可以存在内存中,如果分组结果太大时要将中间结果缓存进临时文件再归并,实现过程非常复杂. 使用集算器辅助Java编程,这些问题都有现成的类库可以解决.下面,我们通过例子来看一下具体作法. 文本文件employee.txt中保存有员工信息,我们要按照DEPT

Java实现文本文件分组汇总的简便方法

程序开发中经常会碰到处理文本文件中数据的情况,这里通过一个例子来看用java实现文本文件分组汇总的方法:从文本文件employee.txt中读取员工信息,按照DEPT分组,求出每组的员工个数COUNT和薪酬SALARY总额. 文本文件empolyee.txt的格式如下: EID   NAME       SURNAME        GENDER  STATE        BIRTHDAY        HIREDATE         DEPT         SALARY 1      

gridpanel分组汇总

[ExtJS5学习笔记]第三十节 sencha extjs 5表格gridpanel分组汇总 2015-05-31     86 本文地址:http://blog.csdn.net/sushengmiyan/article/details/42240531 本文作者:sushengmiyan -------------------------------------------------------------------------------------------------------

SQL CTE 递归 查询省,市,区

IF OBJECT_ID('tb') IS NOT NULL DROP TABLE tb create table tb(id varchar(3) , pid varchar(3) , name varchar(10)) insert into tb values('001' , null , '广东省') insert into tb values('002' , '001' , '广州市') insert into tb values('003' , '001' , '深圳市') inse

R实现大文本文件数据分组汇总的方法

使用R语言对文件数据分组汇总是很普遍的操作,但有时我们会遇到比较大的文件,这类文件的计算结果较小,但源数据太大,无法全部放入内存进行计算,只能采用分批读取.分批计算.拼合结果的办法来解决.下面用一个例子来说明R实现大文件数据分组汇总的方法. 有个1G的文件sales.txt,存储着大量订单记录,我们要对CLIENT字段分组并对AMOUNT字段汇总.该文件的列分割符为"\t",前几行数据如下: R语言解决方案     con <- file("E: \\sales.txt

--DCB分组汇总过程

--DCB分组汇总过程 insert into bs_dcb_counts(id,country,currency_unit,partner,isp,business,cntgamecode,cntmoney,partmoney,bsharkmoney, totalavgmoney,partneravgmoney,pricermb,totalprice,totalrmbprice,cdate,month,year) ( select seq_dcb_billcount.nextval,temp.

SQL对取值范围进行分组汇总的几种办法

在统计工作中,我们经常遇到对一个数量的取值范围进行分组汇总的情况,比如假定id取值为1~20000,按照组距5000进行分组,我们要分别求出5000以下包括5000,5000以上10000以下包括10000,10000以上15000以下包括15000,15000以上20000以下包括20000.的计数,可以用内置取整函数ceil和除法运算得到.select ceil(id/5000) f, count(1) cnt from t1 group by ceil(id/5000) order by

R语言实现固定分组汇总的方法

组名称和组数量已知的分组汇总被称为固定分组汇总,此类算法的分组依据来自于数据集之外,比如:按照参数列表中的客户名单分组,或按照条件列表进行分组.此类算法会涉及分组依据是否超出数据集.是否需要多余的组.数据是否重叠等问题,解决起来有一定的难度.本文将介绍R语言实现固定分组汇总的方法.  例1:分组依据不超出数据集 数据框sales是订单记录,其中CLIENT列是客户名,AMOUNT列是订单金额,请将sales按照"潜力客户列表"进行分组,并对各组的AMOUNT列汇总求和.潜力客户列表为[

SQLServer CTE递归和循环

Create table #country (AreaNam NVARCHAR(10),BelongTo Nvarchar(10),Msg varchar(100)) INSERT INTO #countrySELECT '中国','中国',null union allSELECT '江苏','中国',null union allSELECT '南京','江苏',null union allSELECT '无锡','江苏',null union allSELECT '徐州','江苏',null