行转列和列转行是我们在开发中常遇到的问题,特别是在通信行业,数据经常需要互转,以便从不同维度进行查看和分析。
行转列:数据库SQL,一般通过CASE WHEN 语句或者LEFT JOIN 等链接来实现,相对来讲复杂,今天我们,也可以通过数据库的运算符PIVOT来实现,这里数据库特指MS SQL。
传统的方法,比较好理解,层次也清晰,而且比较习惯。
但是PIVOT (行转列)、UNPIVOT(列转行)提供的语法比一系列复杂的SELECT…CASE 语句中所指定的语法更简单、更具可读性。
最近,遇到一个查询需求,下图展示了一个电联运营商的表格,其中通过“运营商索引值”区分了电信和联通。我想将“小区运营商的最大用户数”这一行数据转换为列,以便查看电信和联通各自的小区运营商最大用户数。
传统做法:
1)根据两个条件,”时间“和”运营商索引值“,分别查出想要的数据,如下图脚本
分别得到两组的数据。
2)这里,我们再应用LEFT JOIN 来组合表列,并对列进行重命名,
SELECTa.日期,a.小区名称,a.小区运营商的最大用户数 as 联通 ,b.小区运营商的最大用户数 as 电信from(---查询联通的selectck.日期,ck.小区名称,ck.运营商索引值,ck.小区运营商的最大用户数fromCUCT_KPI ckwhereck.日期 = '2025-01-14'and ck.运营商索引值 = 0and ck.小区名称 = '******-1_LF_CUCT') aleft join(--查询电信的selectck.日期,ck.小区名称,ck.运营商索引值,ck.小区运营商的最大用户数fromCUCT_KPI ckwhereck.日期 = '2025-01-14'and ck.运营商索引值 = 1and ck.小区名称 = '******-1_LF_CUCT') bona.日期 = b.日期and a.小区名称 = b.小区名称
最终,我们想要的效果,呈现如下:
利用PIVOT (行转列):
1)了解下语法
PIVOT的一般语法是:PIVOT ( 聚合函数(列) FOR 列 in (…) )AS P
完整语法:
table源 A
PIVOT (
聚合函数(value_column) FOR pivot_column IN ( <column_list> )
) B
2、聚合函数
3、我们对上面的表,再做下查询,查出所有值,为了容易识别,我们把运营商索引做下处理,如下代码
selectck.日期,ck.小区名称,casewhen ck.运营商索引值=0 then '联通'when ck.运营商索引值=1 then '电信'end as 运营商,ck.小区运营商的最大用户数fromCUCT_KPI ckwhereck.日期 = '2025-01-14'and ck.小区名称 = '******-1_LF_CUCT'
显示表如下:
table源,我们构建好了,下来就是行转列的处理部分了。
PIVOT(SUM(小区运营商的最大用户数) FOR 运营商 in("联通", "电信")) B
合起来的脚本如下:
select*from(selectck.日期,ck.小区名称,casewhen ck.运营商索引值 = 0 then '联通'when ck.运营商索引值 = 1 then '电信'end as 运营商,ck.小区运营商的最大用户数fromCUCT_KPI ckwhereck.日期 = '2025-01-14'and ck.小区名称 = '****-1_LF_CUCT') APIVOT (sum(小区运营商的最大用户数) for 运营商 in ("联通", "电信")) B
查询所得效果如下:
这两个相对比,效果是一样,但是用PIVOT ,相对更简便些。
掌握好数据库这些方案,也非常有利于,后期,我们在学习KNIME这类大数据分析平台,思路都是相通的,也能达到事半功倍的效果。
点分享
点收藏
点点赞
领取专属 10元无门槛券
私享最新 技术干货