Oracle部分:
行专列pivot:
SELECT * FROM [StudentScores] /*数据源*/
AS P
PIVOT
(
SUM(Score/*行转列后 列的值*/) FOR
p.Subject/*需要行转列的列*/ IN ([语文],[数学],[英语],[生物]/*列的值*/)
) AS T
ps:注意第一行“select * “”中的 * 号 不能换成列名
unpivot:
转换前:
month1 | month2 | month3 | month4 |
12 | 13 | 14 | 15 |
SELECT P.num,P.month
FROM
(
SELECT month1, month2, month3,month4
FROM ProgrectDetail
)T
UNPIVOT
(
Num FOR month IN
(month1 as '1月', month2 as '2月', month3 as '3月', month4 as '4月' )
) P
转换后效果:
month | num |
1月 | 12 |
2月 | 13 |
3月 | 14 |
4月 | 15 |
sqlserver:
PIVOT函数中必须要包含一个聚合函数,聚合函数分别是:COUNT、SUM、MAX、MIN、AVG,针对不同的使用场景,该选择哪个聚合函数,意义都是不一样的,下面还是举例说明吧!
我建了如下一张销售表并且插入一下测试值:
[sql] view plain copy
- CREATE TABLE SalesOrder
- (
- 门店 VARCHAR(50),
- 商品类型 VARCHAR(50),
- 销售额 INT
- )
- INSERT INTO SalesOrder
- SELECT 'ShopA','A',round(100+100*rand(),0) UNION ALL
- SELECT 'ShopA','A',round(100+100*rand(),0) UNION ALL
- SELECT 'ShopA','B',round(200+100*rand(),0) UNION ALL
- SELECT 'ShopA','B',round(200+100*rand(),0) UNION ALL
- SELECT 'ShopA','B',round(200+100*rand(),0) UNION ALL
- SELECT 'ShopA','C',round(1000+100*rand(),0)UNION ALL
- SELECT 'ShopB','A',round(100+100*rand(),0) UNION ALL
- SELECT 'ShopB','A',round(100+100*rand(),0) UNION ALL
- SELECT 'ShopB','B',round(200+100*rand(),0) UNION ALL
- SELECT 'ShopB','C',round(1000+100*rand(),0)UNION ALL
- SELECT 'ShopB','C',round(1000+100*rand(),0)UNION ALL
- SELECT 'ShopC','A',round(100+100*rand(),0) UNION ALL
- SELECT 'ShopC','B',round(200+100*rand(),0) UNION ALL
- SELECT 'ShopC','B',round(200+100*rand(),0) UNION ALL
- SELECT 'ShopC','B',round(200+100*rand(),0) UNION ALL
- SELECT 'ShopC','B',round(200+100*rand(),0) UNION ALL
- SELECT 'ShopC','C',round(1000+100*rand(),0)UNION ALL
- SELECT 'ShopC','C',round(1000+100*rand(),0)
下面我要在PIVOT行转列函数中,使用不同的聚合函数,更直观的统计各个“门店”以及各个”商品类型“的销售情况:
1.SUM:
[sql] view plain copy
- SELECT * FROM SalesOrder
- PIVOT(SUM(销售额) FOR 商品类型 IN(A,B,C)) AS PVT
统计的是各个门店,各个商品类型的总的销售额。
2.COUNT:
[sql] view plain copy
- SELECT * FROM SalesOrder
- PIVOT(COUNT(销售额) FOR 商品类型 IN(A,B,C)) AS PVT
统计的是各个门店,各个商品类型的销售量。
3.MAX:
[sql] view plain copy
- SELECT * FROM SalesOrder
- PIVOT(MAX(销售额) FOR 商品类型 IN(A,B,C)) AS PVT
统计的是各个门店,各个商品类型卖得最贵的销售额。
4.MIN:
[sql] view plain copy
- SELECT * FROM SalesOrder
- PIVOT(MIN(销售额) FOR 商品类型 IN(A,B,C)) AS PVT
和MAX相反,统计的是最便宜的销售额
5.AVG
[sql] view plain copy
- SELECT * FROM SalesOrder
- PIVOT(AVG(销售额) FOR 商品类型 IN(A,B,C)) AS PVT
统计的是各个门店,各个商品类型的销售额的平均值