`

SQL CROSS APPLY OUTER APPLY PIVOT UNPIVOT

 
阅读更多

set nocount on

--> 测试数据:[ta]

if object_id('[ta]') is not null drop table [ta]

go

create table [ta]([id] int,[name] varchar(1))

insert [ta]

select 1,'a'union all

select 2,'b'union all

select 3,'c'union all

select 4,'d'

--> 测试数据:[tb]

if object_id('[tb]') is not null drop table [tb]

go

create table [tb]([id] int,[name] varchar(2))

insert [tb]

select 1,'ff'union all

select 1,'yy'union all

select 1,'yf'union all

select 2,'xx'union all

select 2,'oo'union all

select 3,'xo'union all

select 5,'fy'

--------------开始查询--------------------------

--SQL 2005 新的表运算符apply pivot unpivot

--apply 涉及到下面两个步骤的子集(取决于apply 的类型)

--1、把右表表达式应用到左表输入的行

--2、添加外部行

--使用apply时,就好像先计算左输入,然后为左输入中的每一行计算一次右输入。

--cross apply outer apply的区别在于前者的外部(左侧)在内部(右侧)

--找不到对应航的时候不返回,后者则返回null

--看下面的例子

select * from[ta] a cross apply(select * from tb b where a.[id]=b.[id] )c

select * from[ta] a outer apply(select * from tb b where a.[id]=b.[id] )c

--cross apply 很重要的一个应用就是可以用来返回前N

select c.*from [ta] a cross apply(select top 2 * from tb b where a.[id]=b.[id] order by b.name )c

--pivot 包含下面三个逻辑

--1、隐式分组

--2、隔离值

--3、聚合函数

select * fromtb pivot(count(id) for [id] in([1],[2],[3])) as p

--unpivot

--UNPIVOT PIVOT 执行相反的操作,将表值表达式的列转换为列值。

--UNPIVOT 将与PIVOT 执行几乎完全相反的操作,将列转换为行。

--假设以上示例中生成的表在数据库中存储为pvt

--并且您需要将列标识符Emp1Emp2Emp3Emp4 Emp5 旋转为对应于特定供应商的行值。

--这意味着必须标识另外两个列。包含要旋转的列值(Emp1Emp2...)的列将被称为Employee

--将保存当前位于待旋转列下的值的列被称为Orders。这些列分别对应于

-- Transact-SQL 定义中的pivot_column value_column。以下为该查询。

CREATE TABLE pvt(VendorID int, Emp1 int, Emp2 int,

Emp3 int, Emp4 int, Emp5 int);

GO

INSERT INTO pvt VALUES (1,4,3,5,4,4);

INSERT INTO pvt VALUES (2,4,1,5,5,5);

INSERT INTO pvt VALUES (3,4,3,5,4,4);

INSERT INTO pvt VALUES (4,4,2,5,5,4);

INSERT INTO pvt VALUES (5,5,1,5,5,5);

GO

--select * from pvt

--Unpivot the table.

SELECT VendorID, Employee, Orders

FROM pvt

UNPIVOT(

Orders FOR Employee IN(Emp1, Emp2, Emp3, Emp4, Emp5)

)AS unpvt

GO

--请注意,UNPIVOT 并不完全是PIVOT 的逆操作。PIVOT 会执行一次聚合,

--从而将多个可能的行合并为输出中的单个行。

--UNPIVOT 不会重现原始表值表达式的结果,因为行已经被合并了。

--另外,UNPIVOT 的输入中的空值不会显示在输出中,

--而在执行PIVOT 操作之前,输入中可能有原始的空值。

--PIVOT UNPIVOT 在语法上可能让人很难理解,不过用得多了就熟悉了也就理解了

分享到:
评论

相关推荐

    SQL行列转换 Pivot UnPivot

    SQL 行列转换 Pivot UnPivot SQL 行列转换是指将表格中的行数据转换为列数据,或者将列数据转换为行数据。Pivot 和 UnPivot 是 SQL Server 2005 中引入的两个语法,用于实现行列转换。 Pivot Pivot 语法的主要...

    枢纽表达式PIVOT和UNPIVOT的简单用法,sql server 2005,列转成行

    枢纽表达式PIVOT和UNPIVOT是SQL Server 2005中新增的关系运算符,用于实现行列的旋转。本篇文章将介绍PIVOT和UNPIVOT的简单用法,并提供实例代码。 一、枢纽表达式PIVOT和UNPIVOT的概念 PIVOT和UNPIVOT是SQL ...

    pivot与unpivot函数

    pivot 与 unpivot 函数是SQL05新提供的2个函数 灰常灰常的实用

    SQL Server 2005新功能之PIVOT的描述

    在SQL Server 2005中,PIVOT是一个重要的新特性,它使得数据的行列转换更为便捷。在SQL Server 2000及其以前版本,如果需要将数据的某列值转换为行对应的列,通常需要使用复杂的CASE语句配合聚合函数(如SUM)来实现...

    pivot_unpivot

    在Oracle 11g中引入了两项新功能:`PIVOT` 和 `UNPIVOT`,这两项功能使得在SQL中进行数据的行列转换变得更加简单和直观。这些操作特别适用于报表开发,能够帮助用户快速地将数据按照特定的需求重新组织。 #### 二、...

    深入探讨SQL Server 2008 R2 -PowerPivot

    PowerPivot 与 Excel 和 SharePoint 集成。在 Excel 环境中,PowerPivot for Excel 提供熟悉的工作站式的创作和分析体验。在 SharePoint 场中,PowerPivot for SharePoint 添加了服务器端应用程序和功能,支持对您...

    SQL知识点之列转行Unpivot函数

    在SQL中,Unpivot函数是一种转换数据模式的工具,它能将数据表中的列转换成行。这个功能在处理多值属性或者需要将结构化的数据重新布局时特别有用。在本篇文章中,我们将深入探讨SQL的Unpivot函数,以及如何使用它来...

    SQL Server 关于Pivot详解

    SQL Server 关于 Pivot 详解 在本文中,我们将详细介绍 SQL Server 中的 Pivot 语句,并结合实例分析和实验题目,帮助读者快速掌握其使用。 Pivot 语法 Pivot 语句的基本语法如下: ``` SELECT <非透视的列>, ...

    SQL 2008行列转换的pivot

    ### SQL 2008 行列转换 (Pivot) 的动态实现 #### 知识点一:行列转换(Pivot)的概念与应用场景 在数据库查询中,有时我们需要将数据表中的行转换为列,或者将列转换为行,这种操作被称为行列转换。行列转换在报表...

    SQLServer行列互转实现思路(聚合函数)

    本篇文章将深入探讨如何使用聚合函数Pivot和Unpivot来实现这一目标,特别是针对SQL Server数据库。 首先,让我们了解什么是行转列。行转列就是将表格中的某列值变为新的列名,而原本的行数据则对应到这些新列中。举...

    Oracle行转列之pivot

    在Oracle数据库中,行转列(也称为数据透视)和列转行(unpivot)是SQL查询中用于数据转换的高级功能。从Oracle 11g版本开始,引入了PIVOT和UNPIVOT关键字,以支持显式的查询转换,即从行数据转换为列数据,或从列...

    chap05 Transact-SQL.pdf

    `APPLY`运算符有两种形式:`CROSS APPLY`和`OUTER APPLY`。其中,`CROSS APPLY`会调用表值函数并返回统一的结果集;如果函数对于给定外部行返回空集,则该行不会出现在结果集中。而`OUTER APPLY`则会返回外部表的...

    PIVOT用于将列值旋转为列名

    PIVOT和UNPIVOT操作在SQL Server中的运用,可以极大地方便我们在数据分析过程中对数据进行重塑,使得数据呈现更加直观,从而更好地满足业务需求。掌握这两种操作对于从事数据库管理或数据分析工作的人员来说是非常...

    浅析SQL语句行列转换的两种方法 case…when与pivot函数的应用

    `CASE...WHEN` 和 `PIVOT` 都能实现SQL中的行列转换,但适用情况和写法有所不同。`CASE...WHEN` 更灵活,适用于简单的转换,而 `PIVOT` 更直观且方便处理复杂转换,特别是涉及多个值到多列的转换。在选择使用哪种...

    Mysql 行转列,列转行 SQL语句和示例表结构SQL

    MySQL 提供了两种转换数据布局的方法:行转列(Pivot)和列转行(Unpivot),这在处理复杂的数据汇总和展示时非常有用。本文将深入探讨这两种转换方法,并提供具体的 SQL 语句示例,以及创建示例表结构的 SQL 代码。...

    [sql server]SQL Server2005杂谈(5):将聚合记录集逆时针和顺时针旋转90度.doc

    总之,SQL Server 2005的`PIVOT`和`UNPIVOT`函数为数据的行列转换提供了强大的工具,使得数据在分析和展示时更具灵活性。在处理聚合记录集时,根据需求选择合适的方法进行旋转,可以有效地满足各种报表和分析场景的...

    sql试题及答案,sql 行列转换,sql存储过程实例

    4. **CROSS APPLY或OUTER APPLY**:在某些SQL版本中,可以使用这些运算符配合子查询进行行列转换。 三、SQL 存储过程实例 存储过程是预编译的SQL语句集合,可以提高执行效率,简化复杂的操作,并提供更好的安全性。...

    深入SQL中PIVOT 行列转换详解

    总的来说,SQL中的PIVOT和UNPIVOT是处理表格数据的强大工具,它们帮助我们以更直观的方式呈现数据,使得数据的分析和解释更为便捷。对于需要频繁处理复杂报表或者需要对数据进行多角度分析的场景,理解并熟练运用这...

    SQL基础教程之行转列Pivot函数

    除了SQLSERVER的`PIVOT`,Oracle数据库提供了`UNPIVOT`和`PIVOT`操作,它们的功能类似,但语法有所不同。例如,在Oracle中,你可以这样实现行转列: ```sql SELECT * FROM DailyIncome PIVOT ( SUM(IncomeAmount) ...

    sqlserver行列转换

    需要注意的是,PIVOT 和 UNPIVOT 语句只能在 SQL Server 2005 及更高版本中使用。在 SQL Server 2000 中,需要使用 CASE 语句配合聚合函数或 UNION 语句来实现行列转换。 在实际应用中,行列转换可以用于数据分析和...

Global site tag (gtag.js) - Google Analytics