1、准备数据
create table t_demo(id int,name varchar(20),nums int); ---- 创建表
insert into t_demo values(1, '苹果', 1000);
insert into t_demo values(2, '苹果', 2000);
insert into t_demo values(3, '苹果', 4000);
insert into t_demo values(4, '橘子', 5000);
insert into t_demo values(5, '橘子', 3000);
insert into t_demo values(6, '葡萄', 3500);
insert into t_demo values(7, '芒果', 4200);
insert into t_demo values(8, '芒果', 5500);
2、Pivot行转多列
select *
from (select name, nums from t_demo)
pivot (sum(nums) total,min(nums) min for name in ('苹果' apple, '橘子' orange, '葡萄' grape, '芒果' mango));
Unpivot
1、准备数据
CREATE TABLE t_demo_unpivot as
select *
from (select name, nums from t_demo)
pivot (sum(nums) total,min(nums) min for name in ('苹果' apple, '橘子' orange, '葡萄' grape, '芒果' mango));
2.列转行
select * from t_demo_unpivot unpivot(nums for name in (APPLE_TOTAL,APPLE_MIN,ORANGE_TOTAL,ORANGE_MIN,GRAPE_TOTAL,GRAPE_MIN,MANGO_TOTAL,MANGO_MIN))
3.转多列并包含多个名称
select *
from t_demo_unpivot
unpivot((total,min) for name in ((APPLE_TOTAL,APPLE_MIN) AS '苹果',
(ORANGE_TOTAL,ORANGE_MIN) AS '橘子',
(GRAPE_TOTAL,GRAPE_MIN) AS '葡萄',
(MANGO_TOTAL,MANGO_MIN) AS '芒果'
有时候可能会有这样的需求: 将一张表的所有列名转做为数据的一列数据,将一列数据作为整张表的列名
当列比较多时,只用PIVOT是解决不了的,经过研究,需要将UNPIVOT 和 PIVOT 联合使用
如上面的3个图,我们最终需要把形式1转换为形式3. 然而单用PIvot 解决不了问题,需要分两步转换
第一步:先通过UNPIVOT将所有列转换到数据中的一列...
CREATE TABLE T5 (idnum NUMBER,f1 NUMBER(10,5),f2 NUMBER(10,5),f3 NUMBER(10,5),e1 NUMBER(10,5),e2 NUMBER(10,5),h1 NUMBER(10,5),h2 NUMBER(10,5));
INSERT INTO T5 (IDNUM,F1,F2,F3,E1,E2,H1,H2) VALUES (1,
SQL 当中的 PIVOT 关键字 , 是通过将 表达式 某一列中的唯一值转换为输出中的多个列来旋转表值表达式 , 并在必要时对最终输出的任何其余列值执行聚合 . (即 结果 行 转为 列 )
今天有个同学要做行转列的问题,把实现过程记录一下
首先把同学要实现的原表晒出来,大家看下
这是同学要实现的效果,主要是一行转多行的效果,且转换前不知道有多少唯一行值该转为列
下面直接贴代码,仅供大家参考,如果有疑问请联系我qq,2625526306,有偿代写sql,原创,转载需备注,谢谢
if object_id('tempdb..#test') is not null
drop table #...
TMP_1 AS (SELECT CITY FROM BBBBBBBBBBBBBB B),
TMP_2 AS (SELECT BSFWR FROM TMP_1 A INNER JOIN AREAS B ON A.CITY = B.AREA_NAME)
SELECT BSFWR
FROM TMP_2
pivot函数格式:pivot(聚合函数 for 需要转为列的字段名 in(需要转为列的字段值));
pivot函数说明:实现将指定字段的值转换为列的效果。