PIVOT函数--行转列

首先我们来看下PIVOT函数的英文翻译:

pivot:v 在枢轴上旋转(转动)

首先声明下PIVOT函数的语法格式为:

SELECT [字段1,2,3…] FROM [表名]    -- 将从##TEST表中选出的一些字段作为原表。
AS [原表别名]
PIVOT( [聚合函数] ( [原表字段1] ) FOR [原表字段2] IN ( [原表2值1],[原表字段2值2]… ) ) AS [新表别名]

 

下面以例子讲解PIVOT函数:

1、首先建立一个全局临时表

-- 建立一个全局临时表。临时表还是挺好用的哈,不用写入数据库中,可以用来学习且不用切换数据库
CREATE TABLE ##TEST( 
	project VARCHAR(10), -- 课程 
	student VARCHAR(20), -- 学生
	score DECIMAL        -- 成绩
)
INSERT INTO ##TEST VALUES('语文','小林',85)
INSERT INTO ##TEST VALUES('语文','小龙',89)
INSERT INTO ##TEST VALUES('语文','小龙',98)
INSERT INTO ##TEST VALUES('数学','小林',95)
INSERT INTO ##TEST VALUES('数学','小龙',90)
INSERT INTO ##TEST VALUES('英语','小明',99)
INSERT INTO ##TEST VALUES('英语','小林',97)
INSERT INTO ##TEST VALUES('英语','小龙',98)

SELECT * FROM ##TEST 

结果如下:

然后我们写一个PIVOT用法,来看看它的效果:

SELECT * FROM ##TEST
AS p  -- 将选中的字段作为原表,对应的t表就是新表。
PIVOT(SUM(score) FOR project IN([语文],[数学],[英语])) AS t

可能一下看不懂,在本文的开头我们提到PIVOT的英文含义是在枢轴上旋转,上述sql语句中,直译过来就是原表p以project这个单元格作为枢轴,将project这一列逆时针旋转90度,并去重,原来project的行变成了新表t中的列。

这样可能还不能得到我们想要的结果:

你可能会疑问?为什么会出现聚合函数,我们知道,聚合函数是和GROUP BY一起使用的。这是因为除了PIVOT函数里出现的score和project字段外,原表p中的其他字段都将被GROUP BY,作为新表中的行,因为如此,使得PIVOT结果出现多行。

 

补充一点:临时表只能执行一次,会暂时存贮在内存中,要想删除临时表,执行DROP TABLE ##TEST,即可。

 

 

 

 

  • 7
    点赞
  • 54
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
在Oracle数据库中,行转列和列转行是一种常见的数据转换操作,可以通过使用Oracle的PIVOT和UNPIVOT函数来实现。 1. 行转列PIVOT): 行转列是将一行数据转换为多列数据的操作。在Oracle中,可以使用PIVOT函数来实现行转列操作。Pivot函数将行数据按照指定的列进行分组,并将每个分组的值转换为新的列。 例如,假设有以下表格"sales": ``` +---------+-------+-------+ | Product | Month | Sales | +---------+-------+-------+ | A | Jan | 100 | | A | Feb | 200 | | B | Jan | 150 | | B | Feb | 250 | +--+-------+ ``` 可以使用PIVOT函数将上述表格按照月份进行行转列操作: ```sql SELECT * FROM sales PIVOT ( SUM(Sales) FOR Month IN ('Jan', 'Feb') ); ``` 结果如下: ``` +--+-----+-----+ | A | 100 | 200 | | B | 150 | 250 | +---------+-----+-----+ ``` 2. 列转行(UNPIVOT): 列转行是将多列数据转换为一行数据的操作。在Oracle中,可以使用UNPIVOT函数来实现列转行操作。Unpivot函数将指定的列转换为新的行。 例如,假设有以下表格"sales": ``` +--+-----+ | A | 100 | 200 | | B | 150 | 250 | +---------+-----+-----+ ``` 可以使用UNPIVOT函数将上述表格进行列转行操作: ```sql SELECT * FROM sales UNPIVOT ( Sales FOR Month IN (Jan, Feb) ); ``` 结果如下: ``` +---------+-------+-------+ | Product | Month | Sales | +---------+-------+-------+ | A | Jan | 100 | | A | Feb | 200 | | B | Jan | 150 | | B | Feb | 250 | +--+-------+ ```

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值