SQL Server 2008中增强的汇总技巧

Python爬虫实战:利用最新技术爬取B站视频信息 本文详细介绍了如何使用Python最新技术构建一个功能完善的B站视频信息爬虫。我们从基础爬取开始,逐步深入到反反爬策略、异步处理、数据存储和分析等高级主题。更智能的反反爬策略:使用机器学习识别验证码更高效的分布式架构:结合Kubernetes实现弹性伸缩实时数据管道:将爬取的数据实时推送到数据分析平台多平台支持:扩展支持抖音、YouTube等其他视频平台。 阅读详情

SQL Server 2008中SQL应用系列--目录索引

SQL Server 2008中对汇总有明显的增强,有点像Oracle的语法了。请看下面五个例子:

假定场景如下:某几位员工在不同时间参加了不同的项目,获取了相应的收入,现在需要按各种分类进行统计。

基本表如下:

USE testDb2
GO

IF NOT OBJECT_ID('tb_Income') IS NULL
DROP TABLE [tb_Income]

/****** Object: Table [dbo].[tb_Income] Script Date: 2012/4/5 8:19:21 ******/

CREATE TABLE [dbo].[tb_Income](
[TeamID] int not null,
[PName] [Nvarchar](20) NOT NULL,
[CYear] Smallint NOT NULL,
[CMonth] TinyInt NOT NULL,
[CMoney] Decimal (10,2) Not Null
)
GO
INSERT [dbo].[tb_Income]
SELECT 1,'胡一刀',2011,2,5600
union ALL SELECT 1,'胡一刀',2011,1,5678
union ALL SELECT 1,'胡一刀',2011,3,6798
union ALL SELECT 2,'胡一刀',2011,4,7800
union ALL SELECT 2,'胡一刀',2011,5,8899
union ALL SELECT 3,'胡一刀',2012,8,8877

union ALL SELECT 1,'苗人凤',2011,1,3455
union ALL SELECT 1,'苗人凤',2011,2,4567
union ALL SELECT 2,'苗人凤',2011,3,5676
union ALL SELECT 3,'苗人凤',2011,4,5600
union ALL SELECT 2,'苗人凤',2011,5,6788
union ALL SELECT 2,'苗人凤',2012,6,5679
union ALL SELECT 2,'苗人凤',2012,7,6785

union ALL SELECT 2,'张无忌',2011,2,5600
union ALL SELECT 2,'张无忌',2011,3,2345
union ALL SELECT 2,'张无忌',2011,5,12000
union ALL SELECT 3,'张无忌',2011,4,23456
union ALL SELECT 3,'张无忌',2011,6,4567
union ALL SELECT 1,'张无忌',2012,7,6789
union ALL SELECT 1,'张无忌',2012,8,9998

union ALL SELECT 3,'赵半山',2011,7,6798
union ALL SELECT 3,'赵半山',2011,10,10000
union ALL SELECT 3,'赵半山',2011,9,12021
union ALL SELECT 2,'赵半山',2012,11,8799
union ALL SELECT 1,'赵半山',2012,12,10002

union ALL SELECT 3,'令狐冲',2011,8,7896
union ALL SELECT 3,'令狐冲',2011,9,7890
union ALL SELECT 2,'令狐冲',2011,10,7799
union ALL SELECT 2,'令狐冲',2011,11,9988
union ALL SELECT 2,'令狐冲',2012,9,34567
union ALL SELECT 3,'令狐冲',2012,12,5609

GO

 

数据如下:

SELECT * FROM tb_Income

/*

TeamID PName CYear CMonth CMoney
1 胡一刀 2011 2 5600.00
1 胡一刀 2011 1 5678.00
1 胡一刀 2011 3 6798.00
2 胡一刀 2011 4 7800.00
2 胡一刀 2011 5 8899.00
3 胡一刀 2012 8 8877.00
1 苗人凤 2011 1 3455.00
1 苗人凤 2011 2 4567.00
2 苗人凤 2011 3 5676.00
3 苗人凤 2011 4 5600.00
2 苗人凤 2011 5 6788.00
2 苗人凤 2012 6 5679.00
2 苗人凤 2012 7 6785.00
2 张无忌 2011 2 5600.00
2 张无忌 2011 3 2345.00
2 张无忌 2011 5 12000.00
3 张无忌 2011 4 23456.00
3 张无忌 2011 6 4567.00
1 张无忌 2012 7 6789.00
1 张无忌 2012 8 9998.00
3 赵半山 2011 7 6798.00
3 赵半山 2011 10 10000.00
3 赵半山 2011 9 12021.00
2 赵半山 2012 11 8799.00
1 赵半山 2012 12 10002.00
3 令狐冲 2011 8 7896.00
3 令狐冲 2011 9 7890.00
2 令狐冲 2011 10 7799.00
2 令狐冲 2011 11 9988.00
2 令狐冲 2012 9 34567.00
3 令狐冲 2012 12 5609.00
*/

 

一、使用CUBE汇总数据(http://msdn.microsoft.com/en-us/library/bb522495%28v=sql.105%29.aspx)

小试牛刀,

/*********使用CUBE汇总数据***************/

/********* 3w@live.cn 邀月***************/
SELECT TeamID as 小组ID,
SUM(CMoney) 总收入
FROM tb_Income
GROUP BY CUBE (TeamID)
----ORDER BY TeamID desc

邀月工作室

改进查询:

SELECT TeamID as 小组ID,PName as 姓名,
SUM(CMoney) 总收入
FROM tb_Income
GROUP BY CUBE (TeamID,PName)

邀月工作室

 二、使用ROLLUP汇总数据(Using GROUP BY with ROLLUP, CUBE, and GROUPING SETS | Microsoft Learn)

/*********使用ROLLUP汇总数据***************/

/********* 3w@live.cn 邀月***************/

SELECT TeamID as 小组ID,PName as 姓名,
SUM(CMoney) 总收入
FROM tb_Income
GROUP BY ROLLUP (TeamID,PName)

邀月工作室

 注意:使用Rollup与指定的聚合列的顺序有关。

三、使用Grouping Sets创建自定义汇总数据(Using GROUP BY with ROLLUP, CUBE, and GROUPING SETS | Microsoft Learn)

 除了Cube和Rollup,还有更加灵活强大的自定义集合汇总--Grouping Sets

/*********使用Grouping Sets创建自定义汇总数据***************/

/********* 3w@live.cn 邀月***************/

SELECT TeamID as 小组ID,PName as 姓名,CYear as 年份,----min(CMonth) as 月份,
SUM(CMoney) 总收入
FROM tb_Income
Where CMonth=2
GROUP BY grouping SETS ((TeamID),(TeamID,PName),(CYear,PName))

四、使用Grouping标识汇总行(分组(Transact-SQL) - SQL Server | Microsoft Learn)

 细心的朋友可能会注意到,如果Cube后有两个以上的汇总列时,可能会有一些列是Null,那么这些Null值究竟本身就是Null,还是由于聚合产生的Null呢,此时,Grouping函数大显身手的机会来了。

/*********使用Grouping标识汇总行***************/

/********* 3w@live.cn 邀月***************/
SELECT TeamID as 小组ID,CYear as 年份,
CASE WHEN grouping(TeamID)=0 AND grouping(CYear)=1 THEN '小组汇总'
WHEN grouping(TeamID)=1 AND grouping(CYear)=0 THEN '年份汇总'
WHEN grouping(TeamID)=1 AND grouping(CYear)=1 THEN '所有汇总'
else '正常行' END as 行类别,
SUM(CMoney) 总收入
FROM tb_Income
GROUP BY CUBE (TeamID,CYear)

邀月工作室

至此,如果还有美中不足的话,那就是分组还是有点凌乱,下面我们将隆重推出终极武器--Grouping_ID,它与Grouping类似,但提供更为精细的颗粒度,以确认分组级别,当然使用也更为复杂,请看下面的示例:

五、使用Grouping_ID标识分组级别(http://technet.microsoft.com/zh-cn/library/bb510624.aspx)

为了更清楚地说明问题,我们需要修改一下表结构,增加一个字段--项目所在的地点(AreaID),如下:

/*************修改表结构***************************/

ALTER table tb_Income 
add AreaID int null
GO
update tb_Income SET AreaID=TeamID+CMonth%5+CYear%2
GO


此时数据变成这样:

SELECT * FROM tb_Income

/*
TeamID    PName    CYear    CMonth    CMoney    AreaID
    胡一刀    2011    2    5600.00    4
    胡一刀    2011    1    5678.00    3
    胡一刀    2011    3    6798.00    5
    胡一刀    2011    4    7800.00    7
    胡一刀    2011    5    8899.00    3
    胡一刀    2012    8    8877.00    6
    苗人凤    2011    1    3455.00    3
    苗人凤    2011    2    4567.00    4
    苗人凤    2011    3    5676.00    6
    苗人凤    2011    4    5600.00    8
    苗人凤    2011    5    6788.00    3
    苗人凤    2012    6    5679.00    3
    苗人凤    2012    7    6785.00    4
    张无忌    2011    2    5600.00    5
    张无忌    2011    3    2345.00    6
    张无忌    2011    5    12000.00    3
    张无忌    2011    4    23456.00    8
    张无忌    2011    6    4567.00    5
    张无忌    2012    7    6789.00    3
    张无忌    2012    8    9998.00    4
    赵半山    2011    7    6798.00    6
    赵半山    2011    10    10000.00    4
    赵半山    2011    9    12021.00    8
    赵半山    2012    11    8799.00    3
    赵半山    2012    12    10002.00    3
    令狐冲    2011    8    7896.00    7
    令狐冲    2011    9    7890.00    8
    令狐冲    2011    10    7799.00    3
    令狐冲    2011    11    9988.00    4
    令狐冲    2012    9    34567.00    6
    令狐冲    2012    12    5609.00    5
*/


我们需要统计小组、地区、月份三个维度的汇总数据。

/*********使用Grouping_ID标识分组级别***************/

/*********  3w@live.cn  邀月***************/

SELECT TeamID as 小组ID,AreaID as 地点ID,CMonth as 月份,
SUM(CMoney) 总收入
FROM tb_Income 
Where AreaID IN (3,5,6,7,8,9,2,4) AND CYear =2011  AND CMonth=2
GROUP BY CUBE (TeamID,AreaID,CMonth)
----ORDER  BY TeamID,AreaID,CMonth

统计结果:

邀月工作室

我们注意到,由于维度从两个变成三个,此时数据比较凌乱,即使排序也不能有效解决。幸好,我们有Grouping_ID。看下例:

SELECT TeamID as 小组ID,AreaID as 地点ID,CMonth as 月份,

CASE grouping_ID(TeamID,AreaID,CMonth)
 WHEN 1 THEN '小组/地点汇总'
 WHEN 2 THEN '小组/月份汇总'
 WHEN 3 THEN '小组汇总'
 WHEN 4 THEN '地点/月份汇总'
 WHEN 5 THEN '地点汇总'
 WHEN 6 THEN '月份汇总'
 WHEN 7 THEN '所有汇总'
 else '正常行' END as 行类别,

SUM(CMoney) 总收入
FROM tb_Income 
Where AreaID IN (3,5,6,7,8,9,2,4) AND CYear =2011  AND CMonth=2
GROUP BY CUBE (TeamID,AreaID,CMonth)
----ORDER  BY TeamID,AreaID,CMonth

注意:代码中新增的部分,这里需要稍微解释一下,Grouping_ID接受几个输入列,返回二进制列列表计算的整数值,你可以把这三个维度,看作是(0,1,1)、(0,1,0)这样类似的二进制,而Grouping_ID负责将运算结果以整数形式返回。

效果:

邀月工作室

至此,Group By的汇总暂时告一段落,希望您不虚此行,有所斩获!

小结:带有Cube,Rollup,grouping Sets的Group By函数在统计与分析中有着广泛的应用,相信它的高效简捷,在特定的场合会令人你爱不释手!

邀月注:本文版权由邀月和优快云共同所有,转载请注明出处。
助人等于自助!   3w@live.cn

QML实现ListView的拖动排序 现有一种需求,就是用鼠标拖动某项,动态去改变某一项在ListView中显示的顺序位置,经过研究及实践实战,实现方式的核心代码如下: import QtQuick 2.4 import QtQuick.Controls 1.3 import QtQuick.Window 2.2 import QtQuick.Dialogs 1.2 Rectangle { width: 800 ... 阅读详情

相关推荐

IEC61850客户端连接实战:CMS vs MMS协议抓包对比与性能初探(基于YX-PIS协议栈)

本文深入探讨了IEC61850客户端连接中CMS与MMS协议的抓包对比与性能优化。通过Wireshark抓包分析、协议栈配置实战和性能基准测试,揭示了两种协议在连接建立、数据交互和性能调优方面的关键差异,为智能电网自动化系统的协议选择提供了实用指南。

weixin_29209805的博客 214

SQL 汇总统计及GROUP BY

介绍几个常用的聚集函数及使用方法,使用聚集函数实现分组统计 介绍如何对分组统计的结果进行过滤?, 介绍如何对分组统计的结果进行排序?, 介绍SELECT语句中各个子句的书写顺序

黑码哥的技术博客 2万+

Jetpack Compose Navigation实战:从基础到高级导航模式

本文全面解析Jetpack Compose Navigation在Android开发中的应用,从基础导航实现到高级模式(如单任务/单顶模式),涵盖参数传递、嵌套导航、深层链接等核心功能。通过实战代码示例展示如何优化导航性能,并与ViewModel、Hilt等架构组件整合,为开发者提供高效的Compose导航解决方案。

pz890123456的博客 372

SQL Server 聚合函数与分组学习(group by)

一、SQLServer里面的常用的五种聚合函数。 1.Sum(和)-—对于NULL值默认为0 2.MAX(最大值)MIN(最小值) 3.AVG (平均值)—不统计空值,例如存在有四个人,但是只有三个人有成绩,平均成绩为:总和/3 4.COUNT(数量) --统计所有人分数总和 select sum(score) from T_table --统计表中一共有多少条记录 sele...

有道无术,术尚可求,有术无道,止于术。 9020

VMware ubuntu虚拟机(或Centos7)与主机共享文件夹

系统环境 Windows 10 Vmware Workstation 15 Pro Ubuntu 20.04.1 LTS centos7 1.Ubuntu配置共享文件 1.1安装VMware-tools 更新最新VMware-tools组件 编辑->首选项->更新->立即下载所有组件 安装VMware-tools 虚拟机->安装VMware-tools 安装后ubuntu会加载一个虚拟光驱,解压文件,在解压的文件目录下执行以下命令进行安装 sudo vmware-instal

weixin_38924500的博客 2159

DW3000芯片驱动API介绍

详细介绍DW3000驱动程序API的调用流程说明和中断处理程序流程说明

DT程序员的博客 1518

SQL Server 查询数据并汇总相关技巧 23.08.08

【代码】SQL Server 查询数据并汇总相关技巧 23.08.08。

zgscwxd的博客 1866

SAP 发票凭证反向冲销

发票凭证反向冲销: 业务模拟: MIRO发票校验后,生成发票凭证号: 事务代码MR8M,输入凭证号码,反向冲销(类似于MIGO入库后的反向冲销): 此时进入MIRO查看,发现冲销成功,可以再次做MIRO发票校验: ...

willieyuan的博客 7708

SqlServer2008实例10汇总数据

1.使用CUBE根据GROUP BY子句中的列来为结果集增加汇总值; CUBE为结果集增加行,根据GROUP BY子句巾的列来汇总总数值。下面示例演示了一个根据产品放置的货架束返回产品总数量的查询: SELECT i.Shelf,SUM(i.Quantity) Total FROM Production.ProductInventory i GROUP BY CUBE(i.Shelf) 在下一个查询中,我们将LocationID增加剑SELECT和GROUP BY子句中: USE Adve.

复行数十步 654

使用 syncstart 实现同场景下多个音视频音轨自动化同步

如果需要在视频编辑中同步多个机位的音轨,使得相同的视频能够同时播放,手动操作可能会变得相当复杂。特别是当处理多个视频文件时,例如有10个视频需要互相匹配,实现一对多的同步关系,这就涉及到为每对视频生成匹配的音轨数据。手动完成这样的任务,如生成90套对应的音轨数据,不仅耗时而且容易出错。因此,使用脚本自动化这一过程是一个更为高效和准确的解决方案。通过编写脚本,您可以批量处理多个视频文件,自动同步它们的音轨,大大简化了音视频编辑的工作流程,并确保了同步的准确性。

Mr数据杨 1073

基于STM32、HAL库的SC16IS752IPW总线转UART驱动程序设计

/ FIFO空间不足。// 设置LCR寄存器的DLAB位为1以访问DLL/DLH。// 设置LCR寄存器,先访问DLL/DLH。// 设置LCR寄存器(不包含DLAB位)

corlin6688的博客 815

转载 SQL Server 2008中增强的汇总技巧

SQL Server 2008中SQL应用系列--目录索引 http://blog.youkuaiyun.com/downmoon/article/details/7430645 SQL Server 2008中对汇总有明显的增强,有点像Oracle的语法了。请看下面五个例子: 假定场景如下:某几位员工在不同时间参加了不同的项目,获取了相应的收入,现在需要按各种分类进行统计。 基本表如下:...

de3774的专栏 130

A*寻路算法的最简单通俗讲解

为什么我的眼里常含泪水?因为我有一个算法不会。为了节约点眼泪,今天我们就来介绍著名的A*寻路算法(或简称A*算法)。 Peter Hart, Nils Nilsson 和 Bertram Raphael 在1968年首次提出了著名的A*算法。A*算法其实是Dijkstra最短路径算法的一种扩展。不一样的是,在A*算法中我们需要使用Heuristics 来导引搜索过程,以期达到更好的表现。 ...

白马负金羁 2万+

【转】SQL Server 2008中增强的汇总技巧

【转】SQL Server 2008中增强的汇总技巧 http://blog.youkuaiyun.com/downmoon/article/details/7430645

keenweiwei的专栏 707

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

SQL Server 2008中增强的汇总技巧 .

SQL Server 2008中对汇总有明显的增强,有点像Oracle的语法了。请看下面五个例子: 假定场景如下:某几位员工在不同时间参加了不同的项目,获取了相应的收入,现在需要按各种分类进行统计。 基本表如下: [sql] view plaincopyprint? 01.USE testDb2 02.GO 03. 04.IF NOT OBJECT_ID('tb_Inco

baobaolaogong的专栏 812

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

SQL Server 2008中增强的"汇总"技巧

本文转载:http://www.cnblogs.com/downmoon/archive/2012/04/06/2433988.html SQL Server 2008中的Pivot和UnPivot:http://www.cnblogs.com/downmoon/archive/2012/04/05/2433571.html 值得要要注意 : 不能在 90 兼容模式下使用 CUBE (...

weixin_30628801的博客 94

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

SQL Server 2008中的汇总计算技巧

SQL Server 2008中对汇总有明显的增强,有点像Oracle的语法了。请看下面五个例子: 假定场景如下:某几位员工在不同时间参加了不同的项目,获取了相应的收入,现在需要按各种分类进行统计。 基本表如下: [sql] view plaincopyprint? USE testDb2  GO    IF NOT OBJECT_ID('tb_Income')

lisky119的专栏 2220
上一篇: SQL Server 2008中的Pivot和UnPivot
下一篇: Sql Server 2008中存储过程传入表值参数
downmoon
博客等级 码龄24年 1676粉丝 494原创
评论 12
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值