T-SQL Recipes之Dynamic PIVOT and UNPIVOT

PIVOT

PIVOT在行转列的时候经常用到,最便捷的方式就是通过示例来理解它的作用。

示例1 Query to Return Select Product Data from AdventureWorks

SELECT  PRODUCT.Name AS product_name ,
        PRODUCT.Color AS product_color ,
        PRODUCT_INVENTORY.LocationID ,
        PRODUCT.ReorderPoint ,
        PRODUCT_INVENTORY.Quantity AS product_quantity
FROM    Production.Product PRODUCT
        LEFT JOIN Production.ProductInventory PRODUCT_INVENTORY ON PRODUCT.ProductID = PRODUCT_INVENTORY.ProductID;

结果:

如果我们想要product_coor 在列里面显示每个产品的数量呢?这时候PIVOT就出场了

示例2:Common Use of PIVOT to Report on Products by Color

WITH    PRODUCT_DATA
          AS ( SELECT   PRODUCT.Name AS product_name ,
                        PRODUCT.Color AS product_color ,
                        PRODUCT.ReorderPoint ,
                        PRODUCT_INVENTORY.Quantity AS product_quantity
               FROM     Production.Product PRODUCT
                        LEFT JOIN Production.ProductInventory PRODUCT_INVENTORY ON PRODUCT.ProductID = PRODUCT_INVENTORY.ProductID
             )
    SELECT  *
    FROM    PRODUCT_DATA PIVOT
( SUM(product_quantity) FOR product_color IN ( [Black], [Blue], [Grey],
                                               [Multi], [Red], [Silver],
                                               [Silver/Black], [White],
                                               [Yellow] ) ) PIVOT_DATA;

结果:

从SQL中可以看出PIVOT有两个步骤

  • An aggregate function, which will aggregate if multiple values exist. In the initial
    SELECT statement that returns product data, there were many duplicate rows. This
    example uses SUM whenever this occurs, which will add up product quantities if there
    are multiple rows with the same product name.
  • A value list for all values that will be changed from row data into column headers. In
    this case, the list is of colors from Product.Color .

PS:虽然解决了行转列的问题,但这个时候,我们应该知道color里面到底有多少条唯一的数据,如果在我们不知的情况下,如何解决呢?这个时候动态SQL就来了。

示例3:Common Use of PIVOT to Report on Products by Color

USE AdventureWorks2014;
GO

DECLARE @sql_command NVARCHAR(MAX);
DECLARE @sql_colors NVARCHAR(1000);

SET @sql_command = ‘
WITH    PRODUCT_DATA
          AS ( SELECT   PRODUCT.Name AS product_name ,
                        PRODUCT.Color AS product_color ,
                        PRODUCT.ReorderPoint ,
                        PRODUCT_INVENTORY.Quantity AS product_quantity
               FROM     Production.Product PRODUCT
                        LEFT JOIN Production.ProductInventory PRODUCT_INVENTORY ON PRODUCT.ProductID = PRODUCT_INVENTORY.ProductID
             )
    SELECT  *
    FROM    PRODUCT_DATA PIVOT
( SUM(product_quantity) FOR product_color IN (‘;
WITH    colorlist
          AS ( SELECT DISTINCT
                        Product.Color AS color_name
               FROM     Production.Product
               WHERE    Product.Color IS NOT NULL
             )
    SELECT  @sql_colors = ISNULL(@sql_colors, N‘‘) + N‘,‘
            + QUOTENAME(color_name)
    FROM    colorlist;

SET @sql_colors = STUFF(@sql_colors, 1, 1, ‘‘);

SET @sql_command = @sql_command + @sql_colors + N‘ )) PIVOT_DATA‘;

PRINT @sql_command;
EXEC sp_executesql @sql_command;

首先看一下打印出来的SQL:

WITH    PRODUCT_DATA
          AS ( SELECT   PRODUCT.Name AS product_name ,
                        PRODUCT.Color AS product_color ,
                        PRODUCT.ReorderPoint ,
                        PRODUCT_INVENTORY.Quantity AS product_quantity
               FROM     Production.Product PRODUCT
                        LEFT JOIN Production.ProductInventory PRODUCT_INVENTORY ON PRODUCT.ProductID = PRODUCT_INVENTORY.ProductID
             )
    SELECT  *
    FROM    PRODUCT_DATA PIVOT
( SUM(product_quantity) FOR product_color IN ( [Black], [Blue], [Grey],
                                               [Multi], [Red], [Silver],
                                               [Silver/Black], [White],
                                               [Yellow] ) ) PIVOT_DATA

结果:

从示例1到示例3,我们从中了解到如何把复杂的SQL慢慢分解出来,最后在组合在一起。

UNPIVOT

ds

ds

时间: 2024-08-03 04:37:39

T-SQL Recipes之Dynamic PIVOT and UNPIVOT的相关文章

sql pivot、unpivot和partition by用法

原文:sql pivot.unpivot和partition by用法 演示脚本 IF not exists(SELECT 1 from sys.sysobjects where name = 'Student' AND type = 'U') BEGIN CREATE table Student( ID int identity primary key, ClassID int default 0 , --班级ID CourseName nvarchar(20) , --课程 Name nva

sql 行转列 PIVOT 列转行 UNPIVOT

原文:sql 行转列 PIVOT 列转行 UNPIVOT 一: 现有表一(t_table1),想转为表二(t_table2)的格式. 表一: 年 公司 收入 2013 公司1 12 2013 公司2 22 2013 公司3 32 2012 公司1 42 2012 公司2 52 2012 公司3 62 表二: 年 公司1 公司2 公司3 2012 42 52 62 2013 12 22 32 可使用sql2005之后提供的PIVOT 具体操作如下: select * from   t_table1

通过sql做数据透视表,数据库表行列转换(pivot和Unpivot用法)(一)

在mssql中大家都知道可以使用pivot来统计数据,实现像excel的透视表功能 一.MSsqlserver中我们通常的用法 1.Sqlserver数据库测试 ---创建测试表 Create table s( [name] nvarchar(50), book nvarchar(50), saledNumber int ) ----插入测试数据 insert into s ([name],book,saledNumber) values('小王','java从入门到精通',10); inser

SQL行转列(PIVOT)与列转行(UNPIVOT)简明方法

原文地址:https://www.cnblogs.com/linJie1930906722/p/6036714.html 在做数据统计的时候,行转列,列转行是经常碰到的问题.case when方式太麻烦了,而且可扩展性不强,可以使用 PIVOT,UNPIVOT比较快速实现行转列,列转行,而且可扩展性强 一.行转列 1.测试数据准备 CREATE TABLE [StudentScores] ( [UserName] NVARCHAR(20), --学生姓名 [Subject] NVARCHAR(3

行列转换小结 Pivot ,Unpivot (转,改)

行专列 Pivot 1)SQL 2000版本 静态 SELECT ID , SUM(CASE Code WHEN 'Item1' THEN Value ELSE 0 END) AS Item1 , SUM(CASE Code WHEN 'Item2' THEN Value ELSE 0 END) AS Item2 , SUM(CASE Code WHEN 'Item3' THEN Value ELSE 0 END) AS Item3 FROM RowToCol GROUP BY ID --或者用

sql内置函数pivot强大的行转列功能

原文:sql内置函数pivot强大的行转列功能 语法: PIVOT用于将列值旋转为列名(即行转列),在SQL Server 2000可以用聚合函数配合CASE语句实现 PIVOT的一般语法是:PIVOT(聚合函数(列) FOR 列 in (-) )AS P 完整语法: table_source PIVOT( 聚合函数(value_column) FOR pivot_column IN(<column_list>) ) UNPIVOT用于将列明转为列值(即列转行),在SQL Server 200

Pivot 和 Unpivot

Pivot 和 Unpivot 作者:Arup Nanda  使用简单的 SQL 以电子表格类型的交叉表报表显示任何关系表中的信息,并将交叉表中的所有数据存储到关系表中. Pivot 如您所知,关系表是表格化的,即,它们以列-值对的形式出现.假设一个表名为 CUSTOMERS.SQL> desc customers Name Null? Type ----------------------------------------- -------- ------------------------

Oracle11g 行列转换函数PIVOT and UNPIVOT

作为Oracle开发工程师,推荐大伙看看 PIVOT and UNPIVOT Operators in Oracle Database 11g Release 1 This article shows how to use the new PIVOT and UNPIVOT operators in 11g, as well as giving a pre-11g solution to the same problems. PIVOT UNPIVOT Related articles. PIV

pivot 与 unpivot 函数是SQL05新提供的2个函数

pivot 与 unpivot 函数是SQL05新提供的2个函数   ------------------------------------------------------------------------------ pivot函数: create table test(id int,name varchar(20),quarter int,profile int)insert into test values(1,'a',1,1000)insert into test values(