oracle 行转列 拼接

做一张数据分析报表的时候,碰到一个问题,立刻想建一张临时表,然后再次存储,这样做的好处是查询时简便,坏处是需要写一个存储来定时执行,仔细想了想,第二个解决方案,行转列,合并出结果。

需求大概: 通过多表查询,得出每个城市每个月的销售数量,销售额,成本,售罄率,折扣率,查询后结果如下:

城市时间销售数量销售额
北京14032222233333333
长沙13111111111111111
济南13124828091079808.12
柳州131121762442143
柳州14038439018814.5
宁波14031154621355.56
深圳140119540376399.94
深圳140220027982277.14
武汉140110667896.56
武汉14031262511048.66
湘潭131177231696441
粤西1402113737069.86
郑州13125726375963448.6
北京14022249417478789.06
东莞140258129086475.24
济南1311247097463499
济南14017301369.12
昆明1312235445833.5
昆明140324867145.56
临沂131210071506042
临沂140218583708995.8
南宁1402821249307.51
青岛140195257929672.8
曲靖140230289201449
上海131136290129948.98
武汉14021283487302.56
重庆140120754127677.92

 

而我需要的结果集是这样:

 

1101-11301201-12310101-01310201-0228
当月销售总数量当月零售价总额当月折扣率累计售罄率当月销售总数量当月零售价总额当月折扣率累计售罄率当月销售总数量当月零售价总额当月折扣率累计售罄率当月销售总数量当月零售价总额当月折扣率累计售罄率

需要将每个月的按顺序拼接到后面,查了查资料,这样做完成:

外部再套一层,带出需要的字段,并且加上这一行:

row_number() over(PARTITION BY city order by businessDate asc) rk

根据city分组,根据businessDate升序排列 。然后在外面再嵌套一层,代码如下:

 MAX(decode(rk, 1, businessDate,null)) as businessDate1,
 MAX(decode(rk, 1, total_num, null)) as total_num1,
 MAX(decode(rk, 1, retail_total_amount, null)) as retail_total_amount1,

 MAX(decode(rk, 2, businessDate,null)) as businessDate2,
 MAX(decode(rk, 2, total_num, null)) as total_num2,
 MAX(decode(rk, 2, retail_total_amount, null)) as retail_total_amount2,

..............................

decode函数的用法不需要我再重复了吧 ?  rk就是刚才嵌套的层中排序后多出的一列,按照rk的值进行拼接,拼接后就得到了我想要的结果,一个城市只有一行记录,按照月份拼接在后面。

转载于:https://my.oschina.net/u/576942/blog/215122

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值