SQL Server中GROUPING SETS
类别:数据库 浏览量:1566
时间:2015-8-2 SQL Server中GROUPING SETS
SQL Server中GROUPING SETS使用 GROUPING SETS 的 GROUP BY 子句可以生成一个等效于由多个简单 GROUP BY 子句的 UNION ALL 生成的结果集。
一、下面通过两个实例说明其用法
实例一、统计 Staff 表中的性别、部门、薪资、入职年份
1、创建表 Staff
CREATE TABLE [dbo].[Staff](
[ID] [int] IDENTITY(1,1) NOT NULL,
[Name] [varchar](50) NULL,
[Sex] [varchar](50) NULL,
[Department] [varchar](50) NULL,
[Money] [int] NULL,
[CreateDate] [datetime] NULL
) ON [PRIMARY]
GO
2、为Staff表填充数据
INSERT INTO [dbo].[Staff]([Name],[Sex],[Department],[Money],[CreateDate])
SELECT 'Name1','男','技术部',3000,'2011-11-12'
UNION ALL
SELECT 'Name2','男','工程部',4000,'2013-11-12'
UNION ALL
SELECT 'Name3','女','工程部',3000,'2013-11-12'
UNION ALL
SELECT 'Name4','女','技术部',5000,'2012-11-12'
UNION ALL
SELECT 'Name5','女','技术部',6000,'2011-11-12'
UNION ALL
SELECT 'Name6','女','技术部',4000,'2013-11-12'
UNION ALL
SELECT 'Name7','女','技术部',5000,'2012-11-12'
UNION ALL
SELECT 'Name8','男','工程部',3000,'2012-11-12'
UNION ALL
SELECT 'Name9','男','工程部',6000,'2011-11-12'
UNION ALL
SELECT 'Name10','男','工程部',3000,'2011-11-12'
UNION ALL
SELECT 'Name11','男','技术部',3000,'2011-11-12'
3、使用GROUP BY 子句的 UNION ALL 方式统计
SET STATISTICS IO ON
SET STATISTICS TIME ON
SELECT N'总人数' ,'',COUNT(0) FROM [DBO].[STAFF]
UNION ALL
SELECT N'按性别划分', SEX,COUNT(0) FROM [DBO].[STAFF] GROUP BY SEX
UNION ALL
SELECT N'按部门统计',[DEPARTMENT],COUNT(0) FROM [DBO].[STAFF] GROUP BY [DEPARTMENT]
UNION ALL
SELECT N'按薪资统计',CONVERT(VARCHAR(10),[MONEY]),COUNT(0) FROM [DBO].[STAFF] GROUP BY [MONEY]
UNION ALL
SELECT N'按入职年份',CONVERT(VARCHAR(10),YEAR([CREATEDATE])),COUNT(0) FROM [DBO].[STAFF] GROUP BY YEAR([CREATEDATE])
效果图
执行计划
4、使用GROUPING SETS方式统计
SET STATISTICS IO ON
SET STATISTICS TIME ON
GO
SELECT (CASE
WHEN GROUPING_ID(SEX,[DEPARTMENT],[MONEY],YEAR([CREATEDATE]))=15 THEN N'总人数'
WHEN GROUPING_ID(SEX,[DEPARTMENT],[MONEY],YEAR([CREATEDATE]))=7 THEN N'按性别划分'
WHEN GROUPING_ID(SEX,[DEPARTMENT],[MONEY],YEAR([CREATEDATE]))=11 THEN N'按部门统计'
WHEN GROUPING_ID(SEX,[DEPARTMENT],[MONEY],YEAR([CREATEDATE]))=13 THEN N'按薪资统计'
WHEN GROUPING_ID(SEX,[DEPARTMENT],[MONEY],YEAR([CREATEDATE]))=14 THEN N'按入职年份'
END
),
(CASE
WHEN GROUPING_ID(SEX,[DEPARTMENT],[MONEY],YEAR([CREATEDATE]))=15 THEN ''
WHEN GROUPING_ID(SEX,[DEPARTMENT],[MONEY],YEAR([CREATEDATE]))=7 THEN SEX
WHEN GROUPING_ID(SEX,[DEPARTMENT],[MONEY],YEAR([CREATEDATE]))=11 THEN [DEPARTMENT]
WHEN GROUPING_ID(SEX,[DEPARTMENT],[MONEY],YEAR([CREATEDATE]))=13 THEN CONVERT(VARCHAR(10),[MONEY])
WHEN GROUPING_ID(SEX,[DEPARTMENT],[MONEY],YEAR([CREATEDATE]))=14 THEN CONVERT(VARCHAR(10),YEAR([CREATEDATE]))
END
)
,
COUNT(1)
FROM DBO.[STAFF]
GROUP BY GROUPING SETS (SEX,[DEPARTMENT],[MONEY],YEAR([CREATEDATE]),())
效果图
执行计划
实例二、统计产品销量
计算出每天的销量,总销量,每个销售员的总销量,每个产品的总销量,每个品牌的总销量,及每个销售员按品牌的产品销量
1、创建测试数据库及表并插入测试数据
use master
CREATE DATABASE db_sales
go
use db_sales
go
CREATE TABLE [dbo].[tb_sale](
[id] [int] IDENTITY(1,1) NOT NULL,
[server] [nvarchar](50) NULL,
[pname] [nvarchar](50) NULL,
[pinpai] [nvarchar](50) NULL,
[dates] [smalldatetime] NULL,
[cnt] [int] NULL
) ON [PRIMARY]
go
INSERT INTO [db_ControlManager_ft].[dbo].[test]([server],[pname],[pinpai],[dates],[cnt])
VALUES('A','computer','hp','2012-01-01',1),
('A','computer','hp','2012-01-02',3),
('A','computer','hp','2012-01-03',5),
('A','computer','hp','2012-01-04',1),
('A','computer','hp','2012-01-05',3),
('A','computer','hp','2012-01-06',5),
('A','computer','dell','2012-01-01',2),
('A','computer','dell','2012-01-02',4),
('A','computer','dell','2012-01-03',6),
('A','computer','dell','2012-01-04',7),
('A','computer','dell','2012-01-05',2),
('A','computer','dell','2012-01-06',4),
('B','computer','hp','2012-01-01',3),
('B','computer','hp','2012-01-02',3),
('B','computer','hp','2012-01-03',3),
('B',
标签:SQL Server
您可能感兴趣
- sqlserver 多实例怎么算许可(SQL Server使用row_number分页的实现方法)
- sqlserver访问远程数据库(SQL Server实现跨库跨服务器访问的方法)
- sql server内外连接的作用(浅谈SQL Server交叉联接 内部联接)
- centos中安装sql图(CentOS 7.3上SQL Server vNext CTP 1.2安装教程)
- sqlserver的图形表(SQL Server纵表与横表相互转换的方法)
- sql server 2008自定义函数(SQL SERVER 2012新增函数之逻辑函数CHOOSE详解)
- SQL Server数据类型有哪些
- 循环查询sql server(SQL Server 树形表非循环递归查询的实例详解)
- sql server 进阶(SqlServer AS的用法)
- sqlserver数据库的对象有哪些(详解SQL Server数据库架构和对象、定义数据完整性)
- SQL Server 批量导入数据的方法
- sql server显示当前登录用户命令(SQL Server正确删除Windows认证用户的方法)
- SQL Server中SQL语句或者存储过程的最大长度
- sqlserverlog原理(sql server中错误日志errorlog的深入讲解)
- sqlserver如何设置定时备份(SQL Server使用脚本实现自动备份的思路详解)
- sqlserver乐观锁与悲观锁(sql server中死锁排查的全过程分享)
- 七夕取消了,牛郎织女没做核酸七夕已经取消(牛郎织女没做核酸七夕已经取消)
- 网友抵制 多地取消 夏日祭 为何惹众怒(网友抵制多地取消)
- 兄弟萌,今年的七夕又取消了 思考 思考(今年的七夕又取消了)
- 七夕取消是什么梗(七夕取消是什么梗)
- 这竟然是捏出来的 20种橡皮泥玩法让你轻松hold住魔娃(这竟然是捏出来的)
- 自制橡皮泥(自制橡皮泥)
热门推荐
- mssql 存储过程查询语句(MSSQL分页存储过程完整示例支持多表分页存储)
- linux目录操作功能(Linux 目录结构详细介绍)
- dockerjenkins最新消息(新手必看docker安装jenkins详细教程)
- 为什么做排版老出错(关于排版中经常见的问题及解决方法分享)
- thinkphp5框架怎么打开(thinkphp5.1框架中容器Container和门面Facade的实现方法分析)
- 管理公有云方案(ZKEYS公有云管理系统一键部署操作流程)
- iframe跨域获取标签(iframe跨域的几种常用方法)
- sql的select语句用法(SQL update select结合语句详解及应用)
- python读取文件的方法和区别(浅谈PYTHON 关于文件的操作)
- navicat配置远程访问mysql(解决Navicat无法连接 VMware中Centos系统中的 MySQL服务器的问题)
排行榜
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9