首页 > 数据库 >SQL Server 2005透视表运算符PIVOT应用示例

SQL Server 2005透视表运算符PIVOT应用示例

时间:2023-11-08 12:03:31浏览次数:36  
标签:name 示例 UNION 运算符 amount SQL PIVOT quarter SELECT

SQL Server 2005 行列转换

 

有用SQL写过交叉报表的,往往都比较头痛,还好现在SQL2005中提供了新的PIVOT操作符,可以很简单地写出交叉数据查询。正好前两天在研究ORACLE最新的11G版本提供的新特性,发现ORACLE11G也同样推出这个新PIVOT,而且语法格式也几乎是一样的,呵,看来这些主流的数据库都同质化了,这对我们用户来说,也是一件好事,可以减少学习时间。晕,有点跑题了...
PIVOT的语法格式可以查询SQL2005的帮助文件,里面有详细说明,这里就不多说,以今天http://bbs.sunwy.com/thread-23185-1-1.html里提到的为例做一下介绍。
1、首先生成测试数据:

代码:
Create TABLE 
  T1(Store varchar(20),
     PartNum varchar(10),
     QTY int)
GO
INSERT INTO T1
  SELECT  '成品仓','1001',5 UNION ALL
  SELECT  '成品仓','1002',5 UNION ALL
  SELECT  '成品仓','1003',5 UNION ALL
  SELECT  '成品仓','1004',5 UNION ALL
  SELECT  '原料仓','1001',5 UNION ALL
  SELECT  '原料仓','1002',5 UNION ALL
  SELECT  '原料仓','1003',5 UNION ALL
  SELECT  '销售部','1001',5 UNION ALL
  SELECT  '销售部','1003',5 UNION ALL
  SELECT  '销售部','1004',5
GO

2、开始查询

代码:
SELECT *
  FROM T1 PIVOT (
            SUM(QTY)
   FOR Store IN ([成品仓],[原料仓],[销售部])
    ) as pvt
  ORDER BY PartNum

生成结果

引用:

PartNum    成品仓         原料仓         销售部
---------- ----------- ----------- -----------
1001        5               5                  5
1002        5               5                  NULL
1003        5               5                  5
1004        5               NULL             5
(4 行受影响)

怎么样看到效果了吧,是不是很简单?

对PVIOT里的参数简单说明一下:

SUM(QTY):数据项,对数量进行求各,当然也可选择其它聚合函数,如COUNT(QTY)等

FOR Store IN ([成品仓],[原料仓],[销售部]):指明显示在列区域的字段及相应的取值范围

AS pvt:指定PVT的表别名,当然也可指定为其它的表别名。


这里就不往下深入了,有兴趣的可以查询SQL帮助文档或是在网上搜索一下,在此只是做抛砖引玉,给大家一个思路,建议去学习新的数据库平台上提供新的特性来减轻我们的工作量和提高工作效率。

 

 

--测试PIVOT
IF OBJECT_ID(N'T_PIVOT',N'U') IS NOT NULL
    DROP TABLE T_PIVOT
GO
CREATE TABLE T_PIVOT(
id INT,
name VARCHAR(20),
[quarter] INT,
amount INT
)
GO
INSERT INTO T_PIVOT
SELECT id = 1,name = 'a',[quarter] = 1,amount = 1000
UNION ALL
SELECT id = 1,name = 'a',[quarter] = 2,amount = 2000
UNION ALL
SELECT id = 1,name = 'a',[quarter] = 2,amount = 2000
UNION ALL
SELECT id = 1,name = 'a',[quarter] = 2,amount = 2000
UNION ALL
SELECT id = 1,name = 'a',[quarter] = 3,amount = 3000
UNION ALL
SELECT id = 1,name = 'a',[quarter] = 4,amount = 3500
UNION ALL
SELECT id = 2,name = 'b',[quarter] = 1,amount = 2000
UNION ALL
SELECT id = 2,name = 'b',[quarter] = 2,amount = 2500
UNION ALL
SELECT id = 2,name = 'b',[quarter] = 3,amount = 4000
UNION ALL
SELECT id = 2,name = 'b',[quarter] = 4,amount = 4500
GO
SELECT * FROM T_PIVOT
GO
SELECT id,name,
                 [1] AS 'Q1',
                 [2] AS 'Q2',
                 [3] AS 'Q3',
                 [4] AS 'Q4'
FROM T_PIVOT
PIVOT(
         SUM(amount)
         FOR [quarter] IN([1],[2],[3],[4])
) AS PP
GO
--测试UNPIVOT
IF OBJECT_ID(N'T_UNPIVOT',N'U') IS NOT NULL
     DROP TABLE T_UNPIVOT
GO
CREATE TABLE T_UNPIVOT(
id INT,
name VARCHAR(20),
Q1 INT,
Q2 INT,
Q3 INT,
Q4 INT
)
GO
INSERT     INTO     T_UNPIVOT
SELECT id,name,
                [1] AS 'Q1',
                [2] AS 'Q2',
                [3] AS 'Q3',
                 [4] AS 'Q4'
FROM     T_PIVOT
PIVOT(
         COUNT(amount)
         FOR [quarter] IN([1],[2],[3],[4])
) AS     PP
GO
SELECT * FROM T_UNPIVOT
GO
SELECT     id,name,amount,[quarter]
FROM     T_UNPIVOT
UNPIVOT(
         amount FOR [quarter] IN ([Q1],[Q2],[Q3],[Q4])
) AS     PP


标签:name,示例,UNION,运算符,amount,SQL,PIVOT,quarter,SELECT
From: https://blog.51cto.com/emanlee/8247834

相关文章

  • 赋值运算符,比较运算符,逻辑运算符的应用
    print('-----------赋值运算------------')a=20b=30a=a+b#赋值运算:此处的a是经过20+30后再次赋值给aprint(a)#运行接轨a=50a+=b#这里的运算相当于a=a+b其运算结果为50+30=80print(a)#结果为80a-=b#这里的运算相当于a=a-b其运算结果为80-30......
  • RDS for Mysql 到云数据库GaussDB
    前言该实验旨在指导用户使用DRS将RDSMySQL上的数据迁移到GaussDB中。本实验涉及数据复制服务DRS(DataReplicationService)、关系型数据库服务RDS(RelationalDatabaseService)、GaussDB、数据管理服务DAS(DataAdminService)、VPC(虚拟私有云)、公网IP(EIP)等华为云服务。 说明1)、......
  • C语言程序设计 求阶乘递归函数调用示例
    ......
  • C语言程序设计 运算符的优先级与结合性
     C运算符的优先级与结合优先级运算符含义参与运算对象的数目结合方向 1()[]->.圆括号运算符下标运算符指向结构体成员运算符结构体成员运算符双目运算符双目运算符双目运算符自左至右2!~+......
  • mes 数据库 python sqlite
    importsqlite3fromsqlite3importErrordefcreate_connection():conn=None;try:conn=sqlite3.connect(':memory:')#创建一个内存数据库。对于文件数据库,您可以使用文件路径。print(f'successfulconnectionwithsqliteversion{sqlite3.......
  • SQL Server 2005 数据库对象命名规范 Database Naming Conventions(Guidelines)
    使用SQLServer2005命名数据库对象时可以参照微软的示例数据库AdventureWorks。其次可以参照以下内容:DatabaseNamingConventionsVersion1.1LastRevisedMay13,2004byJasonMaussThemaingoalofadoptinganamingconventionfordatabaseobjectsissothatyouand......
  • 【慢SQL性能优化】 一条SQL的生命周期
    一、一条简单SQL在MySQL执行过程一张简单的图说明下,MySQL架构有哪些组件和组建间关系,接下来给大家用SQL语句分析例如如下SQL语句SELECTdepartment_idFROMemployeeWHEREname='Lucy'ANDage>18GROUPBYdepartment_id其中name为索引,我们按照时间顺序来分析一下......
  • 记一次经典SQL双写绕过题目[极客大挑战 2019]BabySQL 1
    题目环境:<br/>作者已经描述进行了严格的过滤做好心理准备进行迎接判断注入类型admin1'字符型注入<br/><br/>万能密码注入admin1'or'1'='1报错<br/>已经是字符型注入了,所以的话只有or这里存在了过滤联想到buuctf里面还没有碰到双写绕过的题目所以这里斗胆......
  • mysql字符设置
    showvariableslike'character_set_%';要进入mysql数据库,然后对字符集重新进行配置,注意,每次使用安装mysql数据库的时候都要设置SETcharacter_set_system=gbk;SETcharacter_set_server=gbk;SETcharacter_set_client=gbk;SETcharacter_set_connection=gbk;SETcharacter_set......
  • centos7.6 安装MySQL 5.6
    1.添加MySQL5.6的Yum存储库:sudovim/etc/yum.repos.d/mysql56.repo[mysql56-community]name=MySQL5.6CommunityServerbaseurl=http://repo.mysql.com/yum/mysql-5.6-community/el/7/$basearch/enabled=1gpgcheck=02.安装MySQL5.6:sudoyuminstallmysql-server3......