SQL 关于pivot 解释: PIVOT 通过将表达式某一列中的唯一值转换为输出中的多个列来转换表值表达式,并在必要时对最终输出中所需的任何其余的列值执行聚合。 还是通过实例来了解用法和作用: , city -- 所在城市 ): . ( ( 5 ) COLLATE Chinese_PRC_CI_AS N
SQL 关于pivot
解释: PIVOT 通过将表达式某一列中的唯一值转换为输出中的多个列来转换表值表达式,并在必要时对最终输出中所需的任何其余的列值执行聚合。
还是通过实例来了解用法和作用:
,美国空间, city -- 所在城市):
.( (5) COLLATE Chinese_PRC_CI_AS NOT NULL, (10) COLLATE Chinese_PRC_CI_AS NOT NULL, ( ) )
向表一插入数据:
,); ,); ,); ,);
查询所插入的数据:
dbo.Customer
结果如图:
再建表二([dbo].[Orders] 字段说明:orderid -- 订单id , customerid -- 消费者id):
.( , (5) COLLATE Chinese_PRC_CI_AS NULL, ( ) )
向表二插入数据:
); ); ); ); ); ); insert into dbo.Orders values(7,null);
查询插入的数据:
dbo.orders
结果如图:
操作:
在了解PIVOT之前先看这一个题目:
题目1:每个所在城市的消费者的订单情况(请用“没有订单”,“小于两个订单”,“超过两个订单”)Sql语句如下:
, city , (orderid) (orderid) (orderid) dbo.Customers dbo.Orders as o on c.customerid = o.customerid group by c.customerid,city
结果如图:
这个很容易理解不作详解
再引入题目2:每个城市的每种订单情况(请用“没有订单”,“小于两个订单”,美国服务器,“超过两个订单”)的数
方法一:用普通的sql语句进行写:
消费者 , 消费者 , 消费者 ( , city , (orderid) (orderid) (orderid) dbo.Customers dbo.Orders as o on c.customerid = o.customerid group by c.customerid,city ) as d group by 所在城市
结果如图:
方法二:用pivot看它的神奇之处:
select 所在城市,没有订单,小于两个订单,超过两个订单 from ( , city , (orderid) (orderid) (orderid) dbo.Customers dbo.Orders as o on c.customerid = o.customerid group by c.customerid,city ) as d pivot(count(消费者) for 种类 in (没有订单,小于两个订单,超过两个订单)) as p
结果如图:
分析(在看分析时请结合方法一,便于理解):
在看方法二的sql语句可以发现pivot把d的两列(消费者,种类 )作为输入参数,美国空间,而没有作为输入参数(所在城市 )的列作了一个隐式的分组(相当于方法一最后的:group by 所在城市 ),其次它又对 in 子句作了如下操作sql操作:
消费者 end, 消费者 end, 消费者 end
最后对每个case表达式作指定聚合函数sql代码如下:
消费者 , 消费者 , 消费者
好了通过结合方法一与方法二 就应该能够理解pivot的用法了!