qi1128 2022-01-18 11:21 采纳率: 100%
浏览 25
已结题

请问一下 我想求取单个金额占比总额大于10%的产品名称,该怎么写SQL呢

这是我写的:
select cp.pid '产品名称',(priceSALE_AMOUNT) '销售金额',
((price
SALE_AMOUNT)/(sum(price*SALE_AMOUNT))*100%) '占比'
from 销量明细 xl
left join 客户明细 kh on xl.customId = kh.customId
left join 产品明细 cp on xl.pid = cp.pid
下面的where部分需要组件 我就没写进来

报错是1064:
'占比'
from 销量明细 xl
left join 客户明细 kh on xl.customId = kh.' at line 1 *

  • 写回答

1条回答 默认 最新

  • DarkAthena ORACLE应用及数据库设计方案咨询师 2022-01-18 12:19
    关注

    是什么类型的数据库?数据库版本是多少?并请提供表结构,你这SQL明显有问题,没有group by ,也没使用开窗函数,也没使用子查询,这样是算不了占比的。占比先要算出个单独的汇总值


    ---只显示有销售的产品
    select a.pid,a.x/b.x 占比 from 
    (select cp.pid,sum(cp.price*xl.sale_amount) x 
    from 销量明细 xl,产品明细 cp
    where xl.pid=cp.pid
    group by cp.pid) a,
    (select sum(cp.price*xl.sale_amount) x 
    from 销量明细 xl,产品明细 cp
    where xl.pid=cp.pid) b;
    
    ---所有产品都要显示
    select a.pid,a.x/b.x 占比 from 
    (select cp.pid,sum(cp.price*xl.sale_amount) x 
    from 产品明细 cp left join 销量明细 xl
    on  xl.pid=cp.pid
    group by cp.pid) a,
    (select sum(cp.price*xl.sale_amount) x 
    from 销量明细 xl,产品明细 cp
    where xl.pid=cp.pid) b;
    
    ---mysql8以上,先聚合再用开窗
    select a.pid,x/sum(x) over() 占比 from 
    (select cp.pid,sum(cp.price*xl.sale_amount) x 
    from 产品明细 cp left join 销量明细 xl
    on  xl.pid=cp.pid
    group by cp.pid) a;
    
    ---mysql8以上,聚合和开窗一起用
    select cp.pid,sum(cp.price*xl.sale_amount) /
    sum(sum(cp.price*xl.sale_amount) ) over() 占比
    from 产品明细 cp left join 销量明细 xl
    on  xl.pid=cp.pid
    group by cp.pid
    

    至于要过滤出10%的,再包一层写个where条件就行了

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论 编辑记录

报告相同问题?

问题事件

  • 系统已结题 1月26日
  • 已采纳回答 1月18日
  • 创建了问题 1月18日

悬赏问题

  • ¥100 复现论文:matlab仿真代码编写
  • ¥15 esp32驱动GC9A01循环播放视频
  • ¥15 惠普360g9的最新bios
  • ¥30 这个功能用什么软件发合适?
  • ¥60 微信小程序,取消订单,偶尔订单没有改变状态
  • ¥15 用pytorch实现PPO算法
  • ¥15 关于调制信号的星座图?
  • ¥30 前端传参时,后端接收不到参数
  • ¥15 这是有什么问题吗,我检查许可证了但是显示有呢
  • ¥15 机器学习预测遇到的目标函数问题