总结下sqlserver groupwww.129028.com金沙 by 的用法

日期:2020-05-07编辑作者:数据库

我们会看到 使用group by all 后,不符合条件的城市也会出现,只是订单数是零

但是rollup只在层次上对数据进行聚合,而cube对所有的维度进行聚合

使用rollup会对group by列出的第一个分组字段进行汇总运算

因为在rollup中进行的分组统计时,null具有特殊意义

可以看出来对分组中的维度都进行了汇总,并且还有一个订单的总和

CREATETABLErollup(

    orderid       int                  NOT  NULL,

    orderdate   date               NOT  NULL,

    empid         int                  NO  TNULL,

    custid          varchar(10)   NOT  NULL,

    qty               int                  NOT  NULL,

    PRIMARY  KEY(orderid, orderdate)

);

INSERT  INTO  rollup SELECT1, '2010-01-02',3,'A',10;

INSERT  INTO  rollup SELECT2, '2010-04-02',2,'B',20;

INSERT INTO rollupSELECT3, '2010-05-02',1,'A',30;

INSERT  INTO  rollupSELECT4, '2010-07-02',3,'D',40;

INSERT  INTO  rollupSELECT5, '2011-01-02',4,'A',20;

INSERT  INTO  rollupSELECT6, '2011-01-02',3,'B',30;

INSERT  INTO  rollupSELECT7, '2011-01-02',1,'C',40;

INSERT  INTO  rollupSELECT8, '2009-01-02',2,'A',10;

INSERT  INTO  rollupSELECT9, '2009-01-02',3,'B',20;

可以看到多出了一行 是对所有的订单数的汇总

IFNULL(xxx,0)

需要注意的是 All 不能和 cube 和 rollup一起使用,和having一起使用的话,All的功能会失效.

在使用rollup需要注意以下几方面

select Ctiy,count(OrderID) as OrderCountfromSalesInfogroup by Ctiywith cube

(empid,custid,year)表示对这3列进行分组的聚合结果

Create Table SalesInfo(Ctiy nvarchar(50),OrderDate datetime,OrderID int)

首先做一个简单的一维聚合

下一个脚本(注意出现了rollup):

rollup 是根据维度在数据结果集中进行的聚合操作。

下一个脚本:


创建数据脚本

具有N个维度的列,cube需要2的N次方次分组操作,而rollup只需要N次分组操作

select Ctiy,orderdate,orderidfromSalesInfocompute count(orderid)

**在mysql 5.6.17版本中,只定义了cube,但是不支持cube操作:
**

select Ctiy,orderdate,orderidfromSalesInfoorder by Ctiycompute count(orderid) by Ctiy

可以使用LIMIT,但是因为不能使用order by,所以阅读性下降,故大多数情况下无实际意义。

今天用实例总结一下group by的用法。

对多个维度进行rollup才能体现出rollup的优势:

select Ctiy,Year(OrderDate) as OrderYear,count(OrderID) as OrderCountfromSalesInfogroup by Ctiy,Year(OrderDate)with cube

SELEC  Tempid, custid, YEAR(orderdate)  as YEAR, SUM(qty)  sum

FROM  rollup

GROUP BY empid, custid, YEAR(orderdate)

UNION

SELECT  empid, custid, NULL, SUM(qty) as sum

FROM  rollup

GROUP BY empid, custid

UNION

SELECT  empid, NULL, NULL, SUM(qty)  as sum

FROM  rollup

GROUP BY empid

UNION

SELECT  NULL,  NULL, NULL, SUM(qty)  as  sum

FROM  rollup

insert into SalesInfoselect N'北京','2014-06-09',1001union allselect N'北京','2014-08-09',1002union allselect N'北京','2013-10-09',1009union allselect N'大连','2013-08-09',4001union allselect N'大连','2013-10-09',4002union allselect N'大连','2013-05-12',4003union allselect N'大连','2014-11-11',4004union allselect N'大连','2014-12-11',4005

1.

按照不同的城市,分别显示该城市的订单信息,一个显示该城市的所有订单数量

rollup是cube的一种特殊情况,和rollup一样,cube也是一种对数据的聚合操作

select Ctiy,count(OrderID) as OrderCountfromSalesInfowhereCtiy = N'大连'group by all Ctiy

**可以通过rollup来模拟cube:**

显示了两个结果集,一个是订单结果集,一个是订单总数结果集

(empid,custid,null)表示对(empid,custid)两列进行分组的聚合结果

就先说这些了.

www.129028.com金沙 1

首先执行以下脚本:

和普通的group by差别不大,只是多了一个(null,220),表示对所有的year再做一次聚合,即订单数量总和。

select Ctiy,Year(OrderDate) as OrderYear,count(OrderID) as OrderCountfromSalesInfogroup by Ctiy,Year(OrderDate)with rollup

虽然两者得到相同的结果,但是执行计划却不同

下一个脚本:

因此在进行rollup时可以先将null转换成一个不可能存在的值,或者没有特别含义的值,比如:

本文由www.129028.com金沙发布于数据库,转载请注明出处:总结下sqlserver groupwww.129028.com金沙 by 的用法

关键词:

Sql Server中的非聚集索引详细介

这篇我们来解开神秘面纱。 3:通过最后的槽位列表,可以得知173号索引页上存放着8条索引记录。 复制代码 代码如下...

详细>>

必须会的SQL语句(一) 创建数据库与删除数据库【www.129028.com金沙

1.创建数据库 drop命令用于删除数据库。 Create database 名称on primary{ name ='名称', filename ='c:xx名称.mdf', size = 10mb, --数据库...

详细>>

SqlServer提示“列前缀tempdb.无效: 未指定表名”问题解决方案www

在查询凭证、审核凭证时出现“列前缀tempdb.无效:未指定表名”的错误提示,怎么解决? 本文我们总结了几个在安装...

详细>>

【www.129028.com金沙】SQL Server中将查询结果转换为Json格式脚本分享

脚本源码: 复制代码 代码如下:SET ANSI_NULLS ONGOSETQUOTED_IDENTIFIER ONGOCREATEPROCEDURE[dbo].[SerializeJSON](@ParameterSQL ASVARCHAR(MAX)...

详细>>