SQL SERVER中 PIVOT和UNPIVOT的用法【分组统计】

USE LocalAppDB 
GO
---Use aggregate function
SELECT C.customerid, city,
CASE
WHEN COUNT(orderid) = 0 THEN 'no_orders'
WHEN COUNT(orderid) <= 2 THEN 'upto_two_orders'
WHEN COUNT(orderid) > 2 THEN 'more_than_two_orders'
END AS category
FROM dbo.Customers AS C LEFT OUTER JOIN dbo.Orders AS O ON C.customerid = O.customerid
GROUP BY C.customerid, city;
---use pivot key word: Find city [no_orders]/[upto_two_orders]/[more_than_two_orders]'s CustomerID Count
SELECT city,[no_orders],[upto_two_orders],[more_than_two_orders]
FROM 
(
SELECT C.[customerid], [city],
(CASE WHEN COUNT(orderid) = 0 THEN 'no_orders'
WHEN COUNT(orderid) <= 2 THEN 'upto_two_orders'
WHEN COUNT(orderid) > 2 THEN 'more_than_two_orders'
END) AS [category]
FROM dbo.Customers AS C LEFT OUTER JOIN dbo.Orders AS O ON C.customerid = O.customerid
GROUP BY C.customerid, city
) p
PIVOT
(
count(p.[customerid]) FOR p.category
IN ([no_orders],[upto_two_orders],[more_than_two_orders])
) AS pvt
---Can Use this SQL Statement To Replace PIVOT(Just Can Use After SQL 2005 Version ) Key Word
SELECT city,
COUNT(CASE WHEN category = 'no_orders'
THEN customerid END) AS [no_orders],
COUNT(CASE WHEN category = 'upto_two_orders'
THEN customerid END) AS [upto_two_orders],
COUNT(CASE WHEN category = 'more_than_two_orders'
THEN customerid END) AS [more_than_two_orders]
FROM (SELECT C.customerid, city,
CASE
WHEN COUNT(orderid) = 0 THEN 'no_orders'
WHEN COUNT(orderid) <= 2 THEN 'upto_two_orders'
WHEN COUNT(orderid) > 2 THEN 'more_than_two_orders'
END AS category
FROM dbo.Customers AS C
LEFT OUTER JOIN dbo.Orders AS O
ON C.customerid = O.customerid
GROUP BY C.customerid, city) AS D
GROUP BY city;
---Now Test the UNPIVOT Key Word
SELECT city,[no_orders],[upto_two_orders],[more_than_two_orders] INTO dbo.PivotedCategories
FROM 
(
SELECT C.[customerid], [city],
(CASE WHEN COUNT(orderid) = 0 THEN 'no_orders'
WHEN COUNT(orderid) <= 2 THEN 'upto_two_orders'
WHEN COUNT(orderid) > 2 THEN 'more_than_two_orders'
END) AS [category]
FROM dbo.Customers AS C LEFT OUTER JOIN dbo.Orders AS O ON C.customerid = O.customerid
GROUP BY C.customerid, city
) p
PIVOT
(
count(p.[customerid]) FOR p.category
IN ([no_orders],[upto_two_orders],[more_than_two_orders])
) AS pvt
---
UPDATE dbo.PivotedCategories
SET no_orders = NULL, upto_two_orders = 3
WHERE city = 'Madrid';
SELECT * FROM PivotedCategories
---
SELECT city, category, num_custs
FROM dbo.PivotedCategories
UNPIVOT
(	num_custs FOR
category IN([no_orders],
[upto_two_orders],
[more_than_two_orders])
) AS UNPvt
---Drop the Test Table
DROP TABLE dbo.PivotedCategories;


---This Dome Test OVER Key Word 
SELECT orderid, customerid,
COUNT(*) OVER(PARTITION BY customerid) AS num_orders
FROM dbo.Orders
WHERE customerid IS NOT NULL
AND orderid % 2 = 1;
---Use Aggregate Function
SELECT orderid, customerid,
COUNT(*) AS num_orders
FROM dbo.Orders
WHERE customerid IS NOT NULL
AND orderid % 2 = 1
GROUP BY orderid, customerid
----
SELECT seqno,username,ROW_NUMBER() OVER(ORDER BY seqno DESC) AS [Sseqno],password,enabled
FROM dbo.aduser
ORDER BY seqno
----
SELECT seqno,username,ROW_NUMBER() OVER(PARTITION BY username ORDER BY seqno DESC) AS [Sseqno],password,enabled
FROM dbo.aduser
ORDER BY seqno
--
SELECT seqno,username,COUNT(*) OVER(PARTITION BY username) AS [CT],password,enabled
FROM dbo.aduser
ORDER BY seqno
---
SELECT customerid FROM dbo.Customers
EXCEPT
SELECT customerid FROM dbo.Orders;
---
SELECT customerid FROM dbo.Customers
UNION 
SELECT customerid FROM dbo.Orders;

 

 很悲催,之前写的SQL 相关文档人间蒸发鸟,又得慢慢积累,囧~ 

转载于:https://www.cnblogs.com/dowork-perfect/p/3509837.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值