做一张数据分析报表的时候,碰到一个问题,立刻想建一张临时表,然后再次存储,这样做的好处是查询时简便,坏处是需要写一个存储来定时执行,仔细想了想,第二个解决方案,行转列,合并出结果。
需求大概: 通过多表查询,得出每个城市每个月的销售数量,销售额,成本,售罄率,折扣率,查询后结果如下:
城市 | 时间 | 销售数量 | 销售额 |
北京 | 1403 | 22222 | 33333333 |
长沙 | 1311 | 11111 | 11111111 |
济南 | 1312 | 482809 | 1079808.12 |
柳州 | 1311 | 21762 | 442143 |
柳州 | 1403 | 84390 | 18814.5 |
宁波 | 1403 | 11546 | 21355.56 |
深圳 | 1401 | 195403 | 76399.94 |
深圳 | 1402 | 200279 | 82277.14 |
武汉 | 1401 | 1066 | 7896.56 |
武汉 | 1403 | 12625 | 11048.66 |
湘潭 | 1311 | 77231 | 696441 |
粤西 | 1402 | 11373 | 7069.86 |
郑州 | 1312 | 572637 | 5963448.6 |
北京 | 1402 | 22494 | 17478789.06 |
东莞 | 1402 | 581290 | 86475.24 |
济南 | 1311 | 247097 | 463499 |
济南 | 1401 | 730 | 1369.12 |
昆明 | 1312 | 2354 | 45833.5 |
昆明 | 1403 | 2486 | 7145.56 |
临沂 | 1312 | 10071 | 506042 |
临沂 | 1402 | 18583 | 708995.8 |
南宁 | 1402 | 8212 | 49307.51 |
青岛 | 1401 | 952579 | 29672.8 |
曲靖 | 1402 | 30289 | 201449 |
上海 | 1311 | 36290 | 129948.98 |
武汉 | 1402 | 12834 | 87302.56 |
重庆 | 1401 | 20754 | 127677.92 |
而我需要的结果集是这样:
1101-1130 | 1201-1231 | 0101-0131 | 0201-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的值进行拼接,拼接后就得到了我想要的结果,一个城市只有一行记录,按照月份拼接在后面。