当前位置: 首页 > ops >正文

SQL每日一练(3)

前言:

难得看到了套好题,没考我,呜呜,今日第三更!

原始表(ai生成)

1. 销售表(sales)

用途:记录每笔销售的产品 ID 及金额。

product_id(产品 ID)sales_amount(销售金额)
1120
1180
2200
3150
3100
4100
550

2. 产品表(products)

用途:记录产品 ID 与产品名称的映射关系。

product_id(产品 ID)product_name(产品名称)
1产品 A
2产品 B
3产品 C
4产品 D
5产品 E

1、查询所有时间内,销售金额占比大于等于 10% 的产品,并按占比大小降序排序,
结果输出:产品名称 销售金额 占比

2、 所有时间内,销售金额占比大于等于 10% 的产品有多少个?占比排第三大的百分比为(四舍五入 2 位小数)?
填写示例:2 11.24%

题目1:思路:窗口函数:利用sum()over()

SELECTp.product_name AS "产品名称",SUM(s.sales_amount) AS "销售金额",ROUND(SUM(s.sales_amount) * 100.0 / SUM(SUM(s.sales_amount)) OVER(), 2) AS "占比"
FROMsales s
JOINproducts p ON s.product_id = p.product_id
GROUP BYp.product_name
HAVING"占比" >= 10  -- 直接引用SELECT中的别名,简化计算
ORDER BY"占比" DESC;

第二种做法:更直观:利用分布查询:

1、计算每个商品的销售金额:

WITH t1 AS (SELECTp.product_name,SUM(s.sales_amount) AS sales_amountFROMsales sJOINproducts p ON s.product_id = p.product_idGROUP BYp.product_name
)

2、计算前10%

SELECTproduct_name AS "产品名称",sales_amount AS "销售金额",ROUND(sales_amount * 100.0 / (SELECT SUM(sales_amount) FROM t1), 2) AS "占比"
FROMt1
WHEREROUND(sales_amount * 100.0 / (SELECT SUM(sales_amount) FROM t1), 2) >= 10
ORDER BY"占比" DESC;

 第二问:在第一问基础上利用count查询个数,where中加查询条件,要注意排名第三大表达方式limit1 offset2或者dense_rank的窗口去查询

1、还是一样的创建t1表,第一次将商品总值计算

WITH t1 AS (SELECTp.product_name,SUM(s.sales_amount) AS sales_amountFROMsales sJOIN products p ON s.product_id = p.product_idGROUP BY p.product_name
),

 2、创建t2表,计算其中10%的商品,利用dense_rank进行排序,where筛选条件

t2 AS (SELECTproduct_name,sales_amount,ROUND(sales_amount * 100.0 / (SELECT SUM(sales_amount) FROM t1), 2) AS ratio,DENSE_RANK() OVER(ORDER BY ratio DESC) AS dense_rank  -- 密集排名处理并列FROM t1WHERE ROUND(sales_amount * 100.0 / (SELECT SUM(sales_amount) FROM t1), 2) >= 10
)

3 select 即可 count(*)从第二问中查询大于10%的个数,max()找dense_rank=3的产品

SELECTCOUNT(*) AS product_count,MAX(CASE WHEN dense_rank = 3 THEN ratio END) AS third_ratio
FROM t2;
http://www.xdnf.cn/news/8510.html

相关文章:

  • XOR符号
  • esp32+IDF V5.1.1版本编译freertos报错
  • 机器学习——支持向量机(SVM)
  • 怎么开发一个网络协议模块(C语言框架)之(四) 信号量初始化
  • 【Java Web】3.SpringBootWeb请求响应
  • Spring 框架的JDBC 模板技术
  • 使用Python控制Arduino——入门与实战
  • Axure酒店管理系统原型
  • 【如何做好一份技术文档?】用Javadoc与PlantUML构建高质量技术文档(API文档自动化部署)
  • 正则表达式进阶(四):性能优化与调试技巧
  • STM32中的IIC协议和OLED显示屏
  • day26CSS-Sass、Stylus、Less
  • 使用Spring Boot和Spring Security结合JWT实现安全的RESTful API
  • DOM事件的注册和移除
  • 算法学习——从零实现循环神经网络
  • JavaScript从入门到精通(一)
  • JVM学习(四)--对象内存布局
  • AMD硬件笔试面试题型解析
  • 从 0 到 1!Java 并发编程基础全解析,零基础入门必看!
  • 【音频】drc 限幅器、多带限幅器、压缩器、多带压缩器
  • 自制操作系统day9内存管理(cache、位图、列表管理、内存的释放)
  • STM32 CubeMX时钟配置PWM信号输出
  • 生成模型——PixelRNN与PixelCNN
  • 生成模型——扩散模型(Diffusion Model)
  • 阿里云服务器 篇十五:自动签到服务(基于Cookie,脚本和数据分离)
  • 论文学习记录之《DiffusionVel》
  • 文档结构化专家:数字化转型的核心力量
  • Java[IDEA]里的debug
  • 对称加密中GCM和CBC俩种加密模式的区别
  • 八股碎碎念02——Synchronized