Oracle的一条sql使用临时表进行查询

with CTE as(
  SELECT 
    C.SUB_CORP_NAME
    ,B.BUS_PATH_NAME
  	,ROUND(S.ACTUAL_DAY_RUN_TOTAL_MILE / 1000, 2) AS MILE_ALREADY
  	,ROUND(S.DAY_ALREADY_RUN_TOTAL_MILE / 1000, 2) AS CURRENT_MILE
  	,DECODE(S.DAY_ALREADY_RUN_TOTAL_MILE, 0, 0, ROUND(S.ACTUAL_DAY_RUN_TOTAL_MILE / S.DAY_ALREADY_RUN_TOTAL_MILE * 100 ,2)) as RATE
  ,rank() over (order by DECODE(S.DAY_ALREADY_RUN_TOTAL_MILE, 0, 0, ROUND(S.ACTUAL_DAY_RUN_TOTAL_MILE / S.DAY_ALREADY_RUN_TOTAL_MILE * 100 ,2))) rn
  FROM NBBUSITS.T_BUS_PATH_STA_DATA S,NBBUSITS.T_BUS_PATH  B,NBBUSITS.T_BUS_PATH_COMPANY C 
  WHERE 1=1
    AND UPDATE_TIME > to_date(to_char(sysdate,'yyyy/mm/dd'),'yyyy/mm/dd') 
    AND S.BUS_PATH_ID = B.BUS_PATH_ID 
    AND B.BUS_PATH_NAME = C.BUS_PATH_NAME 
    and C.SUB_CORP_NAME like '永平%'
    and S.ACTUAL_DAY_RUN_TOTAL_MILE > 0 and S.DAY_ALREADY_RUN_TOTAL_MILE > 0
)
select b.* from CTE a
left join(
  SELECT 
    T.BUS_PATH_NAME AS CATEGORY
    ,DECODE(SERIES,'CURRENT_MILE','计划','MILE_ALREADY','实际','RATE','完成率') AS SERIES
    ,value
  from CTE UNPIVOT(value for SERIES in (MILE_ALREADY, CURRENT_MILE, RATE)) T 
  LEFT JOIN NBBUSITS.T_ON_DUTY_INFO D ON T.BUS_PATH_NAME = D.SUB_CORP_NAME
)B
on a.BUS_PATH_NAME = B.category
WHERE 1=1
	and RN <= 10
order by rn,CATEGORY,SERIES

使用到第一个知识点,with xxx as (),将一条sql语句的结果作为一个临时变量(临时表)存在xxx,然后在下面就可以将xxx当成表来查询使用,适用在复杂的又只想用一条sql完事的需求。因本案例需要使用到列转行,并且需要在结果中以原本的某一列做排序,故用到with xxx as,

另外用到列转行UNPIVOT、跳跃排序rank() over(order by...)、decode等函数

做为笔记记录,另拓展了解dense_rank() over()、min()/max() over()、lead()/lag() over()、

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值