首页 > 试题广场 >

某电商有100家店铺,每家店铺每天销售商品和销售额gmv的数

[填空题]
某电商有100家店铺,每家店铺每天销售商品和销售额gmv的数据存放在purchase表中,现需统计5月和6月,总gmv中,两个月分别的贡献前50% gmv的店铺,请使用一句SQL1
有店铺销量表purchase:
输出结果如下表:
select  
id, dt, seller_id, seller_name, item_id, gvm
from(
        (select *, month(dt) as mon, sum(gmv) as sum_gmv, rank() over(partition by month(dt) order by sum(gmv) desc)  as ran 
        from purchase 
        where month(dt) in (5,6) 
        group by seller_id, month(dt)) a          # 算gmv的总和, 根据gmv总和排序, 找月份是5,6月份的,并且保存单独月份方便后面分类
    left join 
        (select count(seller_id) as cnt,  month(dt) as mon
         from purchase 
        group by month(dt)) b          # 算出每个月份有多少商铺
    on a.mon = b.mon) c           #按月份join,后面是每月有记录的店铺数,方便后面直接计算
where c.ran <= 0.5*c.cnt          #排名号小于店铺数量*0.5的店铺名,就是总gmv排名前50%的店铺
发表于 2020-08-08 22:05:17 回复(3)
对这题有疑问,为什么贡献gmv的前50%,要用排序的前50%个商品,不用gmv总额占总量*0.5,进行计算?
发表于 2023-10-08 21:17:25 回复(0)

With temp as (
Select substr(dt, 1, 7) as ym, seller_id, seller_name, 
sum(gmv) as tot_gmv, 
rank() over (partition by substr(dt, 1, 7) order by sum(gmv) desc) as rk
From purchase
Group by 1, 2, 3
Where substr(dt, 1, 7) in (’2019-05’, ‘2019-06’)
)

, n_sellers as (
Select substr(dt, 1, 7) as ym, count(distinct seller_id) as cnt 
From purchase
Group by 1
)

Select 
t.ym as year_month, t.seller_id, t.seller_name
From temp t 
Left join n_seller n 
On t.ym = n.ym
Where t.rk <= 0.5*n.cnt

发表于 2023-05-30 02:26:18 回复(0)
# 参考答案有点复杂,主要是通过percentile函数取出前50%的gmv具体是多少,在多用一个字查询查出哪些店铺gmv超过50%的店家gmv
(select p.seller_name
       month(p.dt) as month,
       sum(p.gmv) as total_gmv,
from purchase p 
where month(p.dt) in (5,6)
group by p.seller_id, month(p.dt)) c
join
(select a.seller_name, a.month, percentile(a.total_gmv,0.5) as mid
from
(select p.seller_name        month(p.dt) as month,
sum(p.gmv) as total_gmv,
from purchase p
where month(p.dt) in (5,6)
group by p.seller_id, month(p.dt)) a
group by a.month, a.seller_name) b on c.seller_name=b.seller_name and c.month=b.month
where c.total_gmv>b.mid



发表于 2021-08-21 07:47:23 回复(1)
链接:https://www.nowcoder.com/questionTerminal/be517fb03c854905be5acb706b680199?orderByHotValue=1&page=5&onlyReference=false
来源:牛客网

select concat('2019M',month), seller_name from  (select month(dt) as month, seller_name, sum(gmv) as totalgmv from purchase where month(dt) in ('5' ,'6')  group by month(dt),seller_name) a join (select month, seller_name, percentile(totalgmv, 0.5) as mid From (select month(dt) as month, seller_name, sum(gmv) as totalgmv from purchase where month(dt) in ('5' ,'6')  group by month(dt),seller_name) c Group by month, seller_name) b On a.month = b.month and a.seller_name = b.seller_name where totalgmv > mid
发表于 2020-08-23 10:41:01 回复(0)
select seller_id
    ,seller_name
    ,sale_month
    ,sum(gmv) from (
    select *,month(dt) as sale_month from purchase
    ) as p 
    where sale_month in ('05','06') 
    group by seller_id,seller_name,sale_month 
    having sum(gmv)/(select sum(gmv) from purchase as p1 where p.sale_month=month(dt))>0.5;

发表于 2020-08-13 21:03:32 回复(2)
mysql没percentile怎么搞……
发表于 2020-07-02 11:39:16 回复(3)
SELECT * FROM purchase
WHERE MONTH(dt) IN ('05','06') ,seller_name IN (
    SELECT seller_name 
        FROM purchase 
        GROUP BY seller_name 
        ORDER BY gmv DESC 
        LIMIT 50)
发表于 2020-06-23 04:44:42 回复(3)