问题:已知输入表有字段name,month,amt,求每个人的银行存款总金额、总金额排名以及每个人存款占总金额的占比,输出结果按总金额升序排序
分析:输出的结果一个层层递进的关系(如下图)
CTE的语法结构
with 表1 as(
select 查询语句
),
with 表2 as(
select 查询语句
),
....(中间可插入N张以上结构的表)
select column1,column2 from 表2
解题步骤:①建立第一张临时表,求每个人的存款金额,注意要分组求和 sum()&group by
②建立第二张临时表,根据每个人的存款金额做排序处理,用row_number()over(order by..)
③同样再第二张临时表,求全部人的存款总金额,为后面求占比做准备
SQL代码如下
with temp1 as(
select
name,
sum(amt) as each_amt
from db.emp
group by name
),
temp2 as(
select
*,
row_number()over(order by each_amt desc) as rn,
sum(each_amount)over(partition by null) as total_amt
from temp1
)
select
*,
concat(round(each_amt*100/total_amt,2),'%') as rate
from temp2