行列转换案例

来源:互联网 发布:oracle数据库实例查询 编辑:程序博客网 时间:2024/06/05 17:45

前言

行列转换是我们使用非常频繁的一种场景,但是论坛里的小伙伴还是经常问到,这里用今天遇到的一个问题作为例子,分享下。

案例

create table aa
(
UserID int ,
UserName nvarchar(50),
CityName nvarchar(50)
);
insert into aa (UserID,UserName,CityName) values (1,'上海','a')
insert into aa (UserID,UserName,CityName) values (1,'上海','e')
insert into aa (UserID,UserName,CityName) values (1,'上海','c')
insert into aa (UserID,UserName,CityName) values (2,'北京','b')
insert into aa (UserID,UserName,CityName) values (2,'北京','d')

查询出来结果如下:


需要获得的结果:



分析

从结果看,我们需要对结果进行行转列,和分组两个操作。
首先这个需要行转列,所以肯定可以用case when 但是直接用cityname来做case when。
有个问题是,上海的第一行a和北京的第一行b是不一样的
所以我们引入rn 序列号,来保证上海和北京的第一行都是一样的。



然后对表进行分组,和使用case when 进行常规的行转列,就可以
SELECT UserID ,
username ,
MIN(CASE rn
WHEN 1 THEN CityName
ELSE 'zz'
END) field1 ,
MAX(CASE rn
WHEN 2 THEN CityName
ELSE '1'
END) AS fild2 ,
MAX(CASE rn
WHEN 3 THEN CityName
ELSE ''
END) AS fild3
FROM ( SELECT * ,
ROW_NUMBER() OVER ( PARTITION BY username ORDER BY UserID ) AS rn
FROM AA
) AS t
GROUP BY UserID ,
username




总结

常规的行转列用case  when就很好实现,有时需要先做一些处理才能用。

原创粉丝点击