首页
学习
活动
专区
圈层
工具
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

数据分析之行转列

行转列和列转行是我们在开发中常遇到的问题,特别是在通信行业,数据经常需要互转,以便从不同维度进行查看和分析。

  行转列:数据库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这类大数据分析平台,思路都是相通的,也能达到事半功倍的效果。

点分享

点收藏

点点赞

  • 发表于:
  • 原文链接https://page.om.qq.com/page/OT75lA0bp8HbCXjEJsq2QXHQ0
  • 腾讯「腾讯云开发者社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。

扫码

添加站长 进交流群

领取专属 10元无门槛券

私享最新 技术干货

扫码加入开发者社群
领券